给你一个字符串 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”
代码
class Solution {
int[] fa;
public void init()
{
for(int i=0;i<fa.length;i++)
fa[i]=i;
}
public int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
/* public void union(int x,int y)
{
fa[find(x)]=find(y);
}*/
public String smallestStringWithSwaps(String s, List<List<Integer>> pairs) {
int n=s.length();
fa=new int[n];
init();
for(List<Integer> t:pairs)
{
union(t.get(1),t.get(0));
}
Map<Integer,List<Character> > map=new HashMap<>();
for(int i=0;i<n;i++)
{
int par=find(i);
if(!map.containsKey(par)) map.put(par,new ArrayList<>());
map.get(par).add(s.charAt(i));//纪录同一个父节点的字符
}
for(List<Character > characters:map.values())
{
Collections.sort(characters);//将属于同一个字符集的字符排序
}
StringBuilder stringBuilder=new StringBuilder();
for(int i=0;i<n;i++)//将排序后的各个字符插回字符串中
{
List t=map.get(find(i));
stringBuilder.append(t.remove(0));
}
return stringBuilder.toString();
}
public void union(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return;
fa[x]=y;
}
}