【路飞】算法与数据结构-最大单词长度乘积

111 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

传给你一个字符串数组 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 
解释 : 不存在这样的两个单词。

思路

  • 只包含小写字母(26个)
  • 且两个单词之间不能含有公共字母。
  • 可以使用一个数字(32位)来存储单词中包含的字母。这样就可以使用二进制与运算的方式快速判断两个字母是否有公共字母。
/**
 * @param {string[]} words
 * @return {number}
 */
var maxProduct = function(words) {
    const nums = words.map(getCharCodeSet)
    let ans = 0
    for (let i = 0; i < nums.length; i ++) {
        for (let j = i + 1; j < nums.length; j ++) {
            if ((nums[i] & nums[j]) === 0) {
                ans = Math.max(ans, words[i].length * words[j].length)
            }
        }
    }
    return ans
};

function getCharCodeSet (word) {
   let num = 0
   for (let i = 0; i < word.length; i ++) {
       const bit = 1 << word[i].charCodeAt() - 97
       num |= bit
   }
   return num
}