[路飞]_js算法:leetcode 318-最大单词长度乘积

190 阅读1分钟

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 <= 1000
  • 1 <= words[i].length <= 1000
  • words[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;
};