📅  最后修改于: 2023-12-03 15:06:44.478000             🧑  作者: Mango
在一个包含n个字符串的数组中,我们可以对每个字符串执行一次任意操作,使其变为其他的任意字符串。若要使得所有字符串相等,求需要进行的最小操作次数,或判断是否有可能使得所有字符串相等。
我们可以找到一个要求所有字符串相等的方法:将第一个字符串变为其他所有字符串的平均值,这个平均值可以是字符串的字符组成的拼接。那么只需要统计每个字符串移动到平均字符串的代价,求和即可。
我们可以枚举平均字符串的每一位字符,统计每个字符串移动到平均字符串的代价,例如遍历平均字符串的第i个字符,统计所有字符串中第i个字符需要变化的最少步数。总复杂度是O(n*m^2),其中n为字符串个数,m为字符串长度。
由于每个字符串都需要变为平均字符串,那么统计每个字符相对于平均字符的代价,即每位字符变为平均字符串中对应的字符需要的代价,只需要算一次,遍历字符串时直接累加即可。时间复杂度为O(n*m)
以下为python代码实现:
class Solution:
def minimumMoves(self, arr: List[str]) -> int:
n = len(arr)
m = len(arr[0])
avg = [""] * m
for j in range(m):
cnt = [0] * 26
for i in range(n):
cnt[ord(arr[i][j]) - ord('a')] += 1
avg[j] = chr(ord('a') + cnt.index(max(cnt)))
ans = 0
for i in range(n):
cnt = 0
for j in range(m):
if arr[i][j] != avg[j]:
cnt += 1
ans += cnt
return ans
本题的核心思想是找到所有字符串的平均字符串,然后统计每个字符串变为平均字符串需要的代价。由于平均字符串只需要算一次,所以时间复杂度是O(n*m),其中n为字符串个数,m为字符串长度。