单词长度的最大乘积——位运算

78 阅读1分钟

image.png

代码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
}