剑指OfferII117.相似的字符串

题目

如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。

如果这两个字符串本身是相等的,那它们也是相似的。

例如,"tars" 和 "rats" 是相似的 (交换 0 与 2 的位置);

"rats" 和 "arts" 也是相似的,但是 "star" 不与 "tars","rats",或 "arts" 相似。

总之,它们通过相似性形成了两个关联组:{"tars", "rats", "arts"} 和 {"star"}。

注意,"tars" 和 "arts" 是在同一组中,即使它们并不相似。

形式上,对每个组而言,要确定一个单词在组中,只需要这个词和该组中至少一个单词相似。

给定一个字符串列表 strs。列表中的每个字符串都是 strs 中其它所有字符串的一个 字母异位词 。

请问 strs 中有多少个相似字符串组?

字母异位词(anagram),一种把某个字符串的字母的位置(顺序)加以改换所形成的新词。

示例 1:输入:strs = ["tars","rats","arts","star"] 输出:2

示例 2:输入:strs = ["omv","ovm"] 输出:1

提示:1 <= strs.length <= 300

1 <= strs[i].length <= 300

strs[i] 只包含小写字母。

strs 中的所有单词都具有相同的长度,且是彼此的字母异位词。

注意:本题与主站 839 题相同:

解题思路分析

1、并查集;时间复杂度O(n^3),空间复杂度O(n)

剑指OfferII117.相似的字符串

剑指OfferII117.相似的字符串

func numSimilarGroups(strs []string) int {
   n := len(strs)
   fa = Init(n)
   for i := 0; i < n; i++ {
      for j := i + 1; j < n; j++ {
         if judge(strs[i], strs[j]) == true { // 满足条件,连通
            union(i, j)
         }
      }
   }
   return count
}

func judge(a, b string) bool {
   if a == b {
      return true
   }
   count := 0
   for i := 0; i < len(a); i++ {
      if a[i] != b[i] {
         count++
         if count > 2 {
            return false
         }
      }
   }
   return true
}

var fa []int
var count int

// 初始化
func Init(n int) []int {
   arr := make([]int, n)
   for i := 0; i < n; i++ {
      arr[i] = i
   }
   count = n
   return arr
}

// 查询
func find(x int) int {
   if fa[x] == x {
      return x
   }
   // 路径压缩
   fa[x] = find(fa[x])
   return fa[x]
}

// 合并
func union(i, j int) {
   x, y := find(i), find(j)
   if x != y {
      fa[x] = y
      count--
   }
}

总结

Hard题目,题目同leetcode 839.相似字符串组

展开阅读全文

页面更新:2024-03-13

标签:字符串   本题   复杂度   相似性   新词   示例   初始化   这个词   单词   路径   字母   顺序   题目   位置   两个   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top