6265. 统计相似字符串对的数目

231 阅读1分钟

题目:
给你一个下标从 0 开始的字符串数组 words 。

如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。

  • 例如,"abca" 和 "cba" 相似,因为它们都由字符 'a''b''c' 组成。
  • 然而,"abacba" 和 "bcfd" 不相似,因为它们不是相同字符组成的。

请你找出满足字符串 words[i] **和 **words[j] 相似的下标对 **(i, j) **,并返回下标对的数目,其中 0 <= i < j <= word.length - 1 。
算法:
方法一:模拟
思路:对words中每个元素计算hash(控制相似的字符串hash相同),用map统计每个hash出现的次数count,最后是一个组合公式,对每个count >= 2,统计C2n = n (n - 1) / 2,将结果求和。
因为英文字母只有26位,我们用一个26位长的byte数组表示某个字符是否出现过,对遍历words[i]中的字符后,得到hash值。

func similarPairs(words []string) int {
    ans := 0
    similarWordCount := make(map[string]int)
    for i := range words {
        hash := make([]byte, 26)
        for j := range words[i] {
            index := int(words[i][j] - 'a')
            hash[index] = 1
        }
        similarWordCount[string(hash)] ++
    }
    for _, cnt := range similarWordCount {
        if cnt > 1 {
            ans =  ans + (cnt - 1) * cnt/ 2
        }
    }
    return ans
}