美文网首页
1722. 执行交换操作后的最小汉明距离

1722. 执行交换操作后的最小汉明距离

作者: 来到了没有知识的荒原 | 来源:发表于2021-01-11 11:28 被阅读0次

    1722. 执行交换操作后的最小汉明距离

    并查集

    class Solution {
    public:
        vector<int>p;
        int find(int x){
            if(p[x]!=x)p[x]=find(p[x]);
            return p[x];
        }
    
        void merge(int a,int b){
            int ra=find(a),rb=find(b);
            p[ra]=rb;
        }
        int minimumHammingDistance(vector<int>& s, vector<int>& t, vector<vector<int>>& as) {
            int n=s.size();
            p=vector<int>(n);
            for(int i=0;i<n;i++)p[i]=i;
    
            for(auto v:as){
                int x=v[0],y=v[1];
                merge(x,y);
            }
    
            map<int,vector<int>>mp;
            for(int i=0;i<n;i++){
                int ra=find(p[i]);
                mp[ra].push_back(i);
            }
    
            int res=0;
    
            for(auto i:mp){
                vector<int>v=i.second;
                int l=v.size();
                vector<int>aa(l),bb(l);
                map<int,int>m1,m2;
                for(int i=0;i<l;i++){
                    m1[s[v[i]]]++;
                    m2[t[v[i]]]++;
                }
    
                for(auto j:m1){
                    res+=min(j.second,m2[j.first]);
                }
            }
            return n-res;
        }
    };
    

    跟这个题差不多 1202. 交换字符串中的元素

    class Solution {
    public:
        vector<int>p;
        int find(int x){
            if(p[x]!=x)p[x]=find(p[x]);
            return p[x];
        }
        void merge(int a,int b){
            int ra=find(a),rb=find(b);
            p[ra]=rb;
        }
        string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
            int n=s.size();
            p.resize(n);
            for(int i=0;i<n;i++)p[i]=i;
    
            for(auto v:pairs){
                merge(v[0],v[1]);
            }
    
            map<int,vector<char>>mp;
    
            for(int i=0;i<n;i++){
                int t=find(i);
                mp[t].push_back(s[i]);
            }
    
            for(auto &pp:mp){
                auto &v=pp.second;
                sort(v.rbegin(),v.rend());
            }
    
            for(int i=0;i<n;i++){
                int t=find(i);
                char pos=mp[t].back();
                s[i]=pos;
                mp[t].pop_back();
            }
    
            return s;
        }
    };
    

    相关文章

      网友评论

          本文标题:1722. 执行交换操作后的最小汉明距离

          本文链接:https://www.haomeiwen.com/subject/uszraktx.html