【leetcode】1202. Smallest String With Swaps

题目如下:

You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] = [a, b] indicates 2 indices(0-indexed) of the string.

You can swap the characters at any pair of indices in the given pairs any number of times.

Return the lexicographically smallest string that s can be changed to after using the swaps.

Example 1:

Input: s = "dcab", pairs = [[0,3],[1,2]]
Output: "bacd"
Explaination: 
Swap s[0] and s[3], s = "bcad"
Swap s[1] and s[2], s = "bacd"

Example 2:

Input: s = "dcab", pairs = [[0,3],[1,2],[0,2]]
Output: "abcd"
Explaination: 
Swap s[0] and s[3], s = "bcad"
Swap s[0] and s[2], s = "acbd"
Swap s[1] and s[2], s = "abcd"

Example 3:

Input: s = "cba", pairs = [[0,1],[1,2]]
Output: "abc"
Explaination: 
Swap s[0] and s[1], s = "bca"
Swap s[1] and s[2], s = "bac"
Swap s[0] and s[1], s = "abc"

Constraints:

  • 1 <= s.length <= 10^5
  • 0 <= pairs.length <= 10^5
  • 0 <= pairs[i][0], pairs[i][1] < s.length
  • s only contains lower case English letters.

解题思路:可以用并查集把所有可以交换的下标分成若干个组,每个组里面的下标都是可以互相交换的,这样只需要把每个组中下标所对应的最小字符放到最小下标的位置,次小值放到次小下标的位置...最大值放到最大下标的位置,即可得到结果。

代码如下:

class Solution(object):
    def smallestStringWithSwaps(self, s, pairs):
        """
        :type s: str
        :type pairs: List[List[int]]
        :rtype: str
        """
        parent = [i for i in range(len(s))]
        def find(v):
            if v == parent[v]:
                return v
            return find(parent[v])
        def union(v1,v2):
            p1 = find(v1)
            p2 = find(v2)
            if p1 > p2:
                parent[p1] = p2
            else:
                parent[p2] = p1

        for (i,j) in pairs:
            union(i,j)
        dic_val = {}
        for i in range(len(parent)):
            p = find(i)
            parent[i] = p
            dic_val[p] = dic_val.setdefault(p,'') + s[i]

        for key in dic_val.iterkeys():
            dic_val[key] = ''.join(sorted(list(dic_val[key])))

        res = ''
        for i in parent:
            res += dic_val[i][0]
            dic_val[i] = dic_val[i][1:]

        return res
原文地址:https://www.cnblogs.com/seyjs/p/11582836.html