每日一题——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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值