当前位置: 代码迷 >> 综合 >> LeetCode 1202. 交换字符串中的元素
  详细解决方案

LeetCode 1202. 交换字符串中的元素

热度:23   发布时间:2023-12-13 03:49:12.0

题目描述

1202. 交换字符串中的元素

解法:并查集(C++)

首先要理解一个点:如果把字符抽象为一个图顶点,那么能交换即代表两个图顶点之间连通,而对于一个连通分量,其所含的顶点表示的字符是任意可交换的

既然提到了连通分量,就很容易知道为什么要使用并查集了

下面是 LeetCode 的官方题解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class DisjointSetUnion {
    
private:vector<int> f, rank;int n;public:DisjointSetUnion(int _n) {
    n = _n;rank.resize(n, 1);f.resize(n);for (int i = 0; i < n; i++) {
    f[i] = i;}}int find(int x) {
    return f[x] == x ? x : f[x] = find(f[x]);}void unionSet(int x, int y) {
    int fx = find(x), fy = find(y);if (fx == fy) {
    return;}if (rank[fx] < rank[fy]) {
    swap(fx, fy);}rank[fx] += rank[fy];f[fy] = fx;}
};class Solution {
    
public:string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
    DisjointSetUnion dsu(s.length());for (auto& it : pairs) {
    dsu.unionSet(it[0], it[1]);}unordered_map<int, vector<int>> mp;for (int i = 0; i < s.length(); i++) {
    mp[dsu.find(i)].emplace_back(s[i]);}for (auto& [x, vec] : mp) {
    sort(vec.begin(), vec.end(), greater<int>());}for (int i = 0; i < s.length(); i++) {
    int x = dsu.find(i);s[i] = mp[x].back();mp[x].pop_back();}return s;}
};