1202. 交换字符串中的元素

题目描述:给你一个字符串 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值