1. 程式人生 > 實用技巧 >96 交換字串中的元素(1202)

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