leetcode 318. 最大单词长度乘积
问题描述: 给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
示例 1:
输入: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16
解释 : 这两个单词为 "abcw", "xtfn"。
示例 2:
输入: words = ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4
解释 : 这两个单词为 "ab", "cd"。
示例 3:
输入: words = ["a","aa","aaa","aaaa"]
输出: 0
解释 : 不存在这样的两个单词。
提示:
2 <= words.length <= 10001 <= words[i].length <= 1000words[i]仅包含小写字母 思路: 难点在于求重复字母,这里用到的是位掩码的&运算
/**
* @param {string[]} words
* @return {number}
*/
var maxProduct = function(words) {
const length = words.length;
const masks = new Array(length).fill(0);
//遍历每个单词,得到位掩码 当前字符串26位二进制,标记对应位
for (let i = 0; i < length; i++) {
const word = words[i];
const wordLength = word.length;
for (let j = 0; j < wordLength; j++) {
masks[i] |= 1 << (word[j].charCodeAt() - 'a'.charCodeAt());
}
}
let maxProd = 0;
for (let i = 0; i < length; i++) {
for (let j = i + 1; j < length; j++) {
if ((masks[i] & masks[j]) === 0) {//位掩码&运算可算出是否有重复位,0表示没有重复字母
maxProd = Math.max(maxProd, words[i].length * words[j].length);
}
}
}
return maxProd;
};