1. 程式人生 > 實用技巧 >每日一題——1202. 交換字串中的元素

每日一題——1202. 交換字串中的元素

1202. 交換字串中的元素

分類:圖、並查集

同一個連通分量內的字元可任意交換,故各分量內部排序再放回原本位置

class Solution {
public:
    int root(int *u, int p){
        if (p != u[p])
            u[p] = root(u, u[p]); //路徑壓縮優化
        return u[p];
    }

    void connect(int *u, int i, int j){
        u[root(u, j)] = root(u, i);
    }

    string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
        int *u = new int[s.size()];
        for(int i=0; i<s.size(); i++) u[i] = i;
        for(int i=0; i<pairs.size(); i++){
            connect(u, pairs[i][0], pairs[i][1]);
        }

        priority_queue<char, vector<char>, greater<char> > qs[s.size()];
        for(int i=0; i<s.size(); i++){
            int indexOfSet = root(u, i);
            qs[indexOfSet].push(s[i]);
        }
        
        string res;
        for(int i=0; i<s.size(); i++){
            int indexOfSet = root(u, i);
            res.push_back(qs[indexOfSet].top());
            qs[indexOfSet].pop();
        }

        delete[] u;

        return res;

    }
};/* 12% **/

2021/01/11