LeetCode——1202.字符串交换

在这里插入图片描述

#总体思想是先建图,然后再遍历图去找最大连图分量,然后对每个连通分量排序就可以得到最小值
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、最终会得到一个较小的字符串。

总结:掌握建图和图的遍历(找极大连通分量)。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/112465571