代码1:
1 << (ch - 'a') 这里的位运算通过 1 左移来记录当前位所代表的字母是否存在,并且连续或运算所最终得到当前单词中所有的字符存在情况
从而得到每个单词的二进制表示形式,两个单词进行与运算即可知道是否存在相同的字符,因为只要存在一个相同,其二进制按位与就不可能为 0
func maxProduct(words []string) (ans int) {
masks := make([]int, len(words))
for i, word := range words {
for _, ch := range word {
masks[i] |= 1 << (ch - 'a')
}
}
for i, x := range masks {
for j, y := range masks[:i] {
if x&y == 0 && len(words[i])*len(words[j]) > ans {
ans = len(words[i]) * len(words[j])
}
}
}
return
}
代码2 :
func maxProduct(words []string) (ans int) {
masks := map[int]int{}
for _, word := range words {
mask := 0
for _, ch := range word {
mask |= 1 << (ch - 'a')
}
if len(word) > masks[mask] {
masks[mask] = len(word)
}
}
for x, lenX := range masks {
for y, lenY := range masks {
if x&y == 0 && lenX*lenY > ans {
ans = lenX * lenY
}
}
}
return
}