题意是在一个装着单词的数组里面,找出两个互相之间没有重复字母的单词(某一个单词自身可以有重复字母,比如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的最大好处在于可以迅速判断出比如单词里面每个字母是否出现过这样的问题。
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 };