zoukankan      html  css  js  c++  java
  • 96 交换字符串中的元素(1202)

    作者: Turbo时间限制: 1S章节: 其它

    晚于: 2020-09-09 12:00:00后提交分数乘系数50%

    问题描述 :

    给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 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"

    输入说明 :

    首先输入字符串s

    然后输入数组 pairs的长度n

    再输入n行,每行两个索引a和b,以空格分隔

    1 <= s.length <= 10^5

    0 <= n <= 10^5

    0 <= a,b < s.length

    s 中只含有小写英文字母

    输出说明 :

    输出结果

    输入范例 :

    输出范例 :

    #include <map>
    #include <algorithm>
    using namespace std;
    class Solution {
    public:
        vector<int> p;
        int find(int x)
        {
            if(p[x]!=x)
            {
                p[x]=find(p[x]);
            }
            return p[x];
        }
        void Union(int x,int y)
        {
            int fx=find(x);
            int fy=find(y);
            if(fx==fy)
                return ;
            p[fx]=fy;
        }
        string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) 
        {
            int n=s.size(),len=pairs.size();
            p=vector<int>(n);
            for(int i=0;i<n;i++)
                p[i]=i;
            for(int i=0;i<len;i++)
                Union(pairs[i][0],pairs[i][1]);
            vector<vector<int>> idx(n);
            vector<string> ss(n);
            
            for(int i = 0; i < n;i++){
                int id = find(i);
                idx[id].push_back(i);
                ss[id].push_back(s[i]);
            }
            
            for(int i =0; i < n;i++)
            {
                
                sort(ss[i].begin(),ss[i].end());
             //   cout<<"i:"<<i<<"  "<<ss[i]<<endl;
                for(int k = 0;k <idx[i].size();k++){
                    s[idx[i][k]] = ss[i][k];
                }
            }
            return s;
        }
    };
    int main()
    {
        string s;
        vector<vector<int>> pairs;
        int n,m;
        cin>>s>>n;
        for(int i=0;i<n;i++)
        {
            vector<int> row;
            for(int j=0;j<2;j++)
            {
                cin>>m;
                row.push_back(m);
            }
            pairs.push_back(row);
        }
        string res=Solution().smallestStringWithSwaps(s,pairs);
        cout<<res;
    }
    /*
    通过pairs建立并查集,然后我把每个集合都存在了一个映射里排了个序,然后遍历修改s,
    到s[i]就寻找find(i)对应的集合,弹元素
    sort用法https://blog.csdn.net/lytwy123/article/details/84503492 
    */

     

  • 相关阅读:
    人肉搜索利大于弊?
    上海美容美发连锁店疯狂扩展,大面值会员卡慎办
    jQuery简单入门
    把苦难装在心里《赢在中国》(20080527)
    赢在中国(080304)
    ASP.NET MVC Preview 2新特性
    Lucifer的一场暴强围英雄表演
    php pack、unpack、ord 函数使用方法(二进制流接口应用实例)
    PHP开发绝对不能违背的安全铁则(摘)
    MySQL数据类型:UNSIGNED注意事项
  • 原文地址:https://www.cnblogs.com/zmmm/p/13675693.html
Copyright © 2011-2022 走看看