我需要找到以随机顺序和数量(不仅仅是相邻)对仅包含字母 X、Y 和 Z 的字符串进行排序所需的最小交换量。任意两个字符都可以交换。
例如,字符串 ZYXZYX 将按 3 次交换排序:ZYXZYX -> XYXZYZ -> XXYZYZ -> XXYYZZ ZZXXYY - 4 次交换,XXXX - 0 次交换。
到目前为止,我已经有了这个解决方案,但是排序并没有以最佳方式对字符进行排序,因此结果并不总是最小的交换量。此外,解决方案应该是 O(nlogn)。
def solve(s):
n = len(s)
newS = [*enumerate(s)]
sortedS = sorted(newS, key = lambda item:item[1])
counter = 0
vis = {v:False for v in range(n)}
print(newS)
print(sortedS)
for i in range(n):
if vis[i] or sortedS[i][0] == i:
continue
cycle_size = 0
j = i
while not vis[j]:
vis[j] = True
j = sortedS[j][0]
cycle_size += 1
if cycle_size > 0:
counter += (cycle_size - 1)
return counter
开满天机
红糖糍粑
慕的地10843
相关分类