[LeetCode] Maximum Product of Word Lengths 单词长度的最大积
Given a string array words
, find the maximum value of length(word[i]) * length(word[j])
where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.
Example 1:
Given ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
Return 16
The two words can be "abcw", "xtfn"
.
Example 2:
Given ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
Return 4
The two words can be "ab", "cd"
.
Example 3:
Given ["a", "aa", "aaa", "aaaa"]
Return 0
No such pair of words.
这道题给我们了一个单词数组,让我们求两个没有相同字母的单词的长度之积的最大值。我开始想的方法是每两个单词先比较,如果没有相同字母,则计算其长度之积,然后每次更新结果就能找到最大值。但是我开始想的两个单词比较的方法是利用哈希表先将一个单词的所有出现的字母存入哈希表,然后检查另一个单词的各个字母是否在哈希表出现过,若都没出现过,则说明两个单词没有相同字母,则计算两个单词长度之积并更新结果。但是这种判断方法无法通过OJ的大数据集,上网搜大神们的解法,都是用了mask,因为题目中说都是小写字母,那么只有26位,一个整型数int有32位,我们可以用后26位来对应26个字母,若为1,说明该对应位置的字母出现过,那么每个单词的都可由一个int数字表示,两个单词没有共同字母的条件是这两个int数想与为0,用这个判断方法可以通过OJ,参见代码如下:
解法一:
class Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] val = new int[n];
for(int i=0; i < n; i++){
for(char c : words[i].toCharArray()){
//利用左移性质构造出没个数在整数位上是否出现,并与之前的值或运算,
//因为可能有重复的值出现
val[i] |= 1 << (c - 'a');
}
}
int ret = 0;
for(int i = 0; i < n; i ++){
for(int j = i + 1; j < n; j ++){
if((val[i] & val[j]) != 0)
continue;
ret = Math.max(ret, words[i].length() * words[j].length());
}
}
return ret;
}
}