• 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 
    */

     

  • 相关阅读:
    some Rails leanrning:Rails Ajax,Validates,Cycle
    快速排序与挑白菜
    九月开学
    搜索引擎代码资源
    start RubyOnRails
    垂直搜索引擎之我见
    demo下载:ASP.NET GDI+生成动态的Gif动画
    NHibernate和ADO.Net的性能对比相差有多大?
    手工调试自定义控件各主要方法执行顺序(分运行时和设计时)
    ASP.Net中的缓存方案(不仅仅是Cache和Session)(我在CSDN上和别人的争论)
  • 原文地址:https://www.cnblogs.com/zmmm/p/13675693.html
Copyright © 2020-2023  润新知