解题思路参照:
https://blog.csdn.net/qq_17550379/article/details/101281816
解题思路就是交并集的使用, 需要使用路径压缩算法进行优化
Golang版:
func smallestStringWithSwaps(s string, pairs [][]int) string {
pre:=make([]int, len(s))
for i:=0;i<len(s);i++{pre[i]=i}
//相当于join的功能
for _, v:= range pairs{
x, y:=find(pre, v[0]), find(pre, v[1])
if x!=y{pre[x]=y}
}
un:=make(map[int][]int)
for i:=0;i<len(s);i++{
x:=find(pre, i)
if _,ok:=un[x];ok{
un[x]=append(un[x], int(s[i]))
}else{
un[x]=append([]int{}, int(s[i]))
}
}
for k, _ := range un{sort.Ints(un[k])}
res := make([]byte, len(s))
for i:=0;i<len(s);i++{
x:=find(pre, i)
res[i]=byte(un[x][0])
un[x]=un[x][1:]
}
return string(res)
}
func find(pre []int, x int) int{
r:=x
for pre[x]!=x{
x=pre[x]
}
//路径压缩
i:=0
for pre[r]!=x{
i=pre[r]
pre[r]=x
r=i
}
return x
}