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

 

原文地址:https://www.cnblogs.com/zmmm/p/13675693.html