leetcode 1202. 交换字符串中的元素

144 阅读1分钟

c++

class Solution {
public:
    class UnionSet {
    public:
        int *father, n;
        UnionSet(int n) : n(n) {
            father = new int[n + 1]; 
            for (int i = 0; i <= n; i++) {
                father[i] = i;
            }
        }
        int find(int x) {
            return father[x] = (father[x] == x ? x : find(father[x]));
        }
        void merge(int a, int b) {
            father[find(a)] = find(b);
            return ;
        }
    };
    string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
        UnionSet u(s.size());
        priority_queue<char, vector<char>, greater<char>> h[s.size()];
        for (auto pair : pairs) u.merge(pair[0], pair[1]);
        for (int i = 0; i < s.size(); i++) {
            h[u.find(i)].push(s[i]);
        }
        string ans;
        for (int i = 0; i < s.size(); i++) {
            ans += h[u.find(i)].top();
            h[u.find(i)].pop();
        }
        return ans;
    }
};

js

class UnionSet {
    constructor(n) {
        this.father = new Array(n);
        for (var i = 0; i < n; i++) this.father[i] = i;
    }
    find(x) {
        return this.father[x] = (this.father[x] == x ? x : this.find(this.father[x]));
    }
    merge(a, b) {
        this.father[this.find(a)] = this.find(b); 
    } 
};
var smallestStringWithSwaps = function(s, pairs) {
    var u = new UnionSet(s.length);
    var h = new Array(s.length).fill(0).map(() => Array());
    for ([x, y] of pairs) u.merge(x, y);
    for (var i = 0; i < s.length; i++) h[u.find(i)].push(s[i]);
    for (var i = 0; i < s.length; i++) h[i].sort((a, b) => a.charCodeAt() - b.charCodeAt());
    var ans = "";
    for (var i = 0; i < s.length; i++) {
        ans += h[u.find(i)].shift();
    }
    return ans;
};