Group indices, sort letters per group
Time O((n + p) α(n) + 26n) Space O(26n) worst caseUnion the pairs. For each root, keep a count of its letters (26 buckets). Walk indices left to right and give each the smallest remaining letter from its root's bucket.
import java.util.*;
class Solution {
private int[] parent;
public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
int n = s.length();
parent = new int[n];
for (int i = 0; i < n; i++) parent[i] = i;
for (List<Integer> p : pairs) parent[find(p.get(0))] = find(p.get(1));
Map<Integer, int[]> counts = new HashMap<>();
for (int i = 0; i < n; i++) counts.computeIfAbsent(find(i), k -> new int[26])[s.charAt(i) - 'a']++;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
int[] c = counts.get(find(i));
int k = 0;
while (c[k] == 0) k++;
c[k]--;
sb.append((char) ('a' + k));
}
return sb.toString();
}
private int find(int x) {
while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }
return x;
}
}Verdict: Counting avoids sorting each group.