[路飞] 力扣318 最大单词长度乘🐔

67 阅读1分钟

题目

给你一个字符串数组 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;
};