题目描述:给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
你可以 任意多次交换 在 pairs 中任意一对索引处的字符。
返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。
解题思路:因为交换具有传递性,这其实是一个图论问题,找到所有可以互相连通的连通域集合,在每个连通域内进行升序排序即可
class Solution:
def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
n = len(s)
father = [i for i in range(n)]
s = list(s)
def find(a):
root = a
while(root != father[root]):
root = father[root]
while(a != root):
origin_r = father[a]
father[a] = root
a = origin_r
return a
for p1, p2 in pairs:
root1, root2 = find(p1), find(p2)
if root1 != root2:
father[root1] = root2
from collections import defaultdict
u_t = defaultdict(list)
for i in range(n):
u_t[find(i)].append(i)
for k, indexs in u_t.items():
indexs.sort()
elements = sorted([s[i] for i in indexs])
for i, idx in enumerate(indexs):
s[idx] = elements[i]
return ''.join(s)