#总体思想是先建图,然后再遍历图去找最大连图分量,然后对每个连通分量排序就可以得到最小值
class Solution:
def dfs(self,res,graph,visited,x):
for neighbor in graph[x]:
if not visited[neighbor]:
visited[neighbor] = 1
res.append(neighbor)
self.dfs(res,graph,visited,neighbor)
def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
# 建图
graph = [[] for _ in range(len(s))]
visited = [0] * len(s)
for x,y in pairs:
graph[x].append(y)
graph[y].append(x)
res = list(s)
for i in range(len(s)):
if not visited[i]:
# 获取连通节点
connected_nodes = []
self.dfs(connected_nodes,graph,visited,i)
# 重新赋值
indices = sorted(connected_nodes)
string = sorted(res[node] for node in connected_nodes)
for j,ch in zip(indices,string):
res[j] = ch
return "".join(res)
1、建图,利用交换的关系构建一个图出来。
2、遍历图找到极大连通分量。
3、对连通分量进行排序。
4、然后对原字符串进行重新排序。
5、最终会得到一个较小的字符串。
总结:掌握建图和图的遍历(找极大连通分量)。