| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package main
- type UnionFind struct {
- parent []int
- }
- func NewUnionFind(n int) *UnionFind {
- uf := &UnionFind{parent: make([]int, n)}
- for i := 0; i < n; i++ {
- uf.parent[i] = i
- }
- return uf
- }
- func (uf *UnionFind) Find(x int) int {
- if uf.parent[x] != x {
- uf.parent[x] = uf.Find(uf.parent[x])
- }
- return uf.parent[x]
- }
- func (uf *UnionFind) Unite(x, y int) {
- x, y = uf.Find(x), uf.Find(y)
- if x == y {
- return
- }
- if x > y {
- x, y = y, x
- }
- // 总是让字典序更小的作为集合代表字符
- uf.parent[y] = x
- }
- func smallestEquivalentString(s1 string, s2 string, baseStr string) string {
- uf := NewUnionFind(26)
- for i := 0; i < len(s1); i++ {
- uf.Unite(int(s1[i]-'a'), int(s2[i]-'a'))
- }
- res := []byte(baseStr)
- for i := range res {
- res[i] = byte('a' + uf.Find(int(res[i]-'a')))
- }
- return string(res)
- }
|