Swap Lex Order
Idea
Code
String solution(String str, int[][] pairs) {
Map<Integer, Set<Integer>> map = new HashMap<>();
for(int[] pair: pairs){
int u = pair[0];
int v = pair[1];
map.putIfAbsent(u, new HashSet<>());
map.putIfAbsent(v, new HashSet<>());
map.get(u).add(v);
map.get(v).add(u);
}
List<TreeSet<Integer>> sccs = new ArrayList<>();
Set<Integer> visited = new HashSet<>();
for(Integer curr: map.keySet()){
if(!visited.contains(curr)){
TreeSet<Integer> scc = new TreeSet();
scc.add(curr);
dfs(visited, scc, map, curr);
sccs.add(scc);
}
}
char[] arr = str.toCharArray();
for(TreeSet<Integer> scc: sccs){
List<Character> ordered = new ArrayList<>();
for(int ind: scc){
ordered.add(arr[ind-1]);
}
Collections.sort(ordered);
Collections.reverse(ordered);
int i = 0;
for(int ind: scc){
arr[ind-1] = ordered.get(i);
i++;
}
}
return String.valueOf(arr);
}
void dfs(Set<Integer> visited, TreeSet<Integer> scc, Map<Integer, Set<Integer>> map, int curr){
for(int currNeigh: map.get(curr)){
if(!visited.contains(currNeigh)){
visited.add(currNeigh);
scc.add(currNeigh);
dfs(visited, scc, map, currNeigh);
}
}
}Last updated