zoukankan      html  css  js  c++  java
  • 1202. 交换字符串中的元素

    1202. 交换字符串中的元素

    给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。

    你可以 任意多次交换 在 pairs 中任意一对索引处的字符。

    返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

    示例 2:

    输入:s = "dcab", pairs = [[0,3],[1,2],[0,2]]
    输出:"abcd"
    解释:
    交换 s[0] 和 s[3], s = "bcad"
    交换 s[0] 和 s[2], s = "acbd"
    交换 s[1] 和 s[2], s = "abcd"

    并查集

    并查集,是一种判断“远房亲戚”的算法。

    打个比方:你身边的某个“朋友”,很有可能就是你父亲的母亲的姑妈的大姨的哥哥的表妹的孙子的女儿的父亲的孙子。如果给定这么一张“家谱”(无向图),如何判断两个顶点是不是“亲戚”呢?用人话说,就是判断一个图中两个点是否联通(两个顶点相互联通则为亲戚)

    class Solution:
        def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
            p={i:i for i in range(len(s))}    #初始化
            ans=["" for _ in range(len(s))]  
            def find(a):                            #合并
                while p[a]!=a:
                    p[a]=p[p[a]]
                    a=p[a]
                return p[a]
            def union(a,b):
                pa,pb=find(a),find(b)
                p[pa]=pb
            for a,b in pairs:
                union(a,b)
            group = defaultdict(list)
            for i in range(len(s)):
                group[find(i)].append(i)
            for i in group.values():
                sub=[s[k] for k in i]
                sub.sort()
                i.sort()
                for m,n in zip(sub,i):
                    ans[n]=m
            return "".join(ans)
  • 相关阅读:
    C++ 虚函数表解析
    C#编写简单的聊天程序
    c#事件与委托
    c#文本控件实现换行
    docker 详细安装及问题排查
    hadoop命令行
    Spark中的多线程并发处理
    CDH6.1.0离线安装——笔记
    linux 常用命令
    Rsync 恢复 libselinux.SO.1
  • 原文地址:https://www.cnblogs.com/lzk-seven/p/14261565.html
Copyright © 2011-2022 走看看