1202.文字列内の要素を交換する

1202.文字列内の要素を交換する

リンク:https//leetcode-cn.com/problems/smallest-string-with-swaps/

文字列s文字列内 の「インデックスペア」の配列を指定  しますpairs。これpairs[i] = [a, b]は、文字列内の2つのインデックスを 表します(番号付けは0から始まります)。

 インデックスの任意のペアで 、任意の回数で文字を 交換でき pairsます。

いくつかの交換の後にs なり得る最小の文字列を辞書式に返します。

 

例1:

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

例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"

例3:

输入:s = "cba", pairs = [[0,1],[1,2]]
输出:"abc"
解释:
交换 s[0] 和 s[1], s = "bca"
交换 s[1] 和 s[2], s = "bac"
交换 s[0] 和 s[1], s = "abc"

 

促す:

  • 1 <= s.length <= 10^5
  • 0 <= pairs.length <= 10^5
  • 0 <= pairs[i][0], pairs[i][1] < s.length
  • s 小文字の英字のみが含まれています

アイデア:タイトルに記載されているインデックスペアを使用すると、何度でも交換できます.2つのインデックスペア間に重複する要素がある場合、2つのインデックスが所有する3つの要素間の順序を任意に交換できることがわかります同様に、相互接続されたインデックスペアが占める要素の順序は自由に交換できます。辞書式順序を最小にし、交換できる要素間の辞書式順序を最小にする必要があります。交換できる要素はコレクションであると考えており、この関係を維持するためにユニオン検索を使用することを考えるのは自然なことです。

class Solution {
public:

    int Father[100010], Rank[100010];

    int Find(int x){
        if(x != Father[x]){
            return Father[x] = Find(Father[x]);
        }
        return x;
    }

    void Union(int A,int B){
        A = Find(A);
        B = Find(B);
        if(A != B){
            if(Rank[A] < Rank[B]){
                Father[A] = B;
            }else if(Rank[A] > Rank[B]){
                Father[B] = A;
            }else{
                Father[A] = B;
                ++ Rank[B];
            }  
        }
    }

    string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
        unordered_set<int> Hash_Set;
        vector<int> Index[100010];
        vector<char> StrChar[100010];
        int n = s.length(), i, a, b, m = pairs.size(), index;
        for(i = 0; i < n; ++ i){
            Father[i] = i;
            Rank[i] = 1;
        }
        for(i = 0; i < m; ++ i){
            a = pairs[i][0];
            b = pairs[i][1];
            cout << "Union : " << a << " " << b << endl;
            Union(a, b);
        }
        for(i = 0; i < n; ++ i){ //统计一共有几个集合
            if(Hash_Set.find(Find(i)) == Hash_Set.end()){
                Hash_Set.insert(Father[i]);
            }
            Index[Father[i]].push_back(i);
            StrChar[Father[i]].push_back(s[i]);
        }
        unordered_set<int>::iterator iter;
        for(iter = Hash_Set.begin(); iter != Hash_Set.end(); ++ iter){
            index = * iter;
            m = Index[index].size();
            sort(StrChar[index].begin(),StrChar[index].end());
            for(i = 0; i < m; ++ i){
                s[Index[index][i]] = StrChar[index][i];
            }  
        }
        return s;
    }
};

 

 

おすすめ

転載: blog.csdn.net/qq_39304630/article/details/112465499