题目:
给你一个下标从 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
}