add: 220427 [cpp]
This commit is contained in:
parent
77e2da22ae
commit
8c0ffa7567
|
|
@ -0,0 +1,57 @@
|
|||
#include <vector>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <unordered_map>
|
||||
#include <iostream>
|
||||
#include <functional>
|
||||
|
||||
/**
|
||||
* 1202. Smallest String With Swaps
|
||||
* You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] = [a, b] indicates 2 indices(0-indexed) of the string.
|
||||
* You can swap the characters at any pair of indices in the given pairs any number of times.
|
||||
* Return the lexicographically smallest string that s can be changed to after using the swaps.
|
||||
*/
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
static std::string smallestStringWithSwaps(const std::string& s, const std::vector<std::vector<int>>& pairs) {
|
||||
const int n = s.length();
|
||||
|
||||
// Disjoint Set
|
||||
int* mother = new int[n];
|
||||
for (int i = 0; i < n; ++i)
|
||||
mother[i] = i;
|
||||
|
||||
std::function<int(int)> Find = [&](int x) { return mother[x] == x ? x : mother[x] = Find(mother[x]); };
|
||||
auto Union = [&](int x, int y) { mother[Find(x)] = Find(y); };
|
||||
|
||||
for (const auto& p : pairs)
|
||||
Union(p[0], p[1]);
|
||||
|
||||
std::unordered_map<int, std::vector<int>> m;
|
||||
for (int i = 0; i < n; ++i)
|
||||
m[Find(i)].push_back(i);
|
||||
|
||||
std::string ans = s;
|
||||
for (const auto& [i, v] : m) {
|
||||
if (v.size() <= 1)
|
||||
continue;
|
||||
|
||||
int cnt[26]{};
|
||||
for (int idx : v)
|
||||
++cnt[s[idx] - 'a'];
|
||||
|
||||
for (int ptr = 0, j = 0; ptr < 26; ++ptr)
|
||||
while (cnt[ptr]--)
|
||||
ans[v[j++]] = 'a' + ptr;
|
||||
}
|
||||
|
||||
return ans;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
auto ans = Solution::smallestStringWithSwaps("dcab", {{0,3},{1,2}});
|
||||
std::cout << ans << "\n";
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue