[LeetCode] 318. Maximum Product of Word Lengths

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 318. Maximum Product of Word Lengths相关的知识,希望对你有一定的参考价值。

题意是在一个装着单词的数组里面,找出两个互相之间没有重复字母的单词(某一个单词自身可以有重复字母,比如foo, test)比如A和B好了,算出A.length() * B.length()的最大值。

思路是用bitmap。可以参考这个帖子,https://leetcode.com/problems/maximum-product-of-word-lengths/discuss/215611/Bit-solution-full-explanation-(javascript)-80-ms

用bitmap的方式非常巧妙,代码如下,11行用 |= 找出每个单词里面每个字母都出现过几次。18行当两个单词相与的时候,如果结果为0,可以判断出两个单词没有互相重复的字母。bitmap的最大好处在于可以迅速判断出比如单词里面每个字母是否出现过这样的问题。

时间O(n) - n是单词个数

空间O(1) - 只有一个32位的数组

 1 /**
 2  * @param {string[]} words
 3  * @return {number}
 4  */
 5 var maxProduct = function(words) {
 6     var max = 0;
 7     var holder = new Array(words.length).fill(0);
 8 
 9     for (var i = 0; i < words.length; i++) {
10         for (var j = 0; j < words[i].length; j++) {
11             holder[i] |= 1 << (words[i].charCodeAt(j) - 97);
12         }
13     }
14 
15     var len = words.length - 1;
16     for (var i = 0; i < len; i++) {
17         for (var j = i + 1; j <= len; j++) {
18             if ((holder[i] & holder[j]) === 0) {
19                 max = Math.max(max, words[i].length * words[j].length);
20             }
21         }
22     }
23 
24     return max;
25 };

 

以上是关于[LeetCode] 318. Maximum Product of Word Lengths的主要内容,如果未能解决你的问题,请参考以下文章

318. Maximum Product of Word Lengths

Leetcode 318. Maximum Product of Word Lengths

Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths