Skip to main content

最大单词长度乘积

Tips

题目类型: 位运算

题目

给你一个字符串数组 words, 找出并返回 length(words[i]) * length(words[j]) 的最大值, 并且这两个单词不含有公共字母. 如果不存在这样的两个单词, 返回 0.

示例
输入: words = ["abcw", "baz", "foo", "bar",  "xtfn","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "xtfn".
输入: words = ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
输出: 4
解释: 这两个单词为 "ab", "cd".
输入: words = ["a" ,"aa", "aaa", "aaaa"]
输出: 0
解释: 不存在这样的两个单词.

题解

位运算的方式说实话也没高到哪里去. 它的思路就是把字母换成二进制, 比如 a 就是 1, b 就是 10, c 就是 100...

这样的话, 我们就可以可以通过 & 运算符, 来对比两个单词是否有重复. 比起朴素版本, 减少了 hasCommonLeter 函数的耗时操作.

/**
* @param {string[]} words
* @return {number}
*/
var maxProduct = function (words) {
let max = 0
const bitWords = []

for (let i = 0; i < words.length; i++) {
let bitWord = 0

for (const letter of words[i]) {
// 把字符串换成二进制掩码形式
bitWord |= 1 << (letter.charCodeAt() - 97)
}

bitWords[i] = bitWord
}

for (let i = 0; i < bitWords.length; i++) {
for (let j = 1; j < bitWords.length; j++) {
// 通过按位与来对比两个单词是否有重复
if ((bitWords[i] & bitWords[j]) === 0) {
max = Math.max(max, words[i].length * words[j].length)
}
}
}

return max
}

复杂度分析

318-max-product.png