题目
给你一个字符串数组 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 解释:不存在这样的两个单词。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ma… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
把单词用一个26位数组存储(0代表没存取,1代表存取) 比较两个单词有没有公共的的字母是本题的关键,我们只需要将两个单词的26位flag数组两两比较,如果两个都为1就代表有公共的字母.
代码实现
/**
* @param {string[]} words
* @return {number}
*/
var maxProduct = function(words) {
let arrayFlags = [];
let result = 0;
for (let i = 0; i < words.length; i++) {
arrayFlags.push(new Array().fill(0));
}
for (let i = 0; i < words.length; i++) {
for (let j = 0; j < words[i].length; j++) {
arrayFlags[i][words[i][j].charCodeAt(0) - 'a'.charCodeAt(0)] = 1;
}
}
for (let i = 0; i < words.length - 1; i++) {
for (let j = i + 1; j < words.length; j++) {
let k = 0;
for (; k < 26; k++) {
if (arrayFlags[i][k] && arrayFlags[j][k]) {
break;
}
}
if (k == 26) {
let prod = words[i].length * words[j].length;
result = Math.max(result, prod);
}
}
}
return result;
};