题目描述:
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.
分析:
题目让求的是两个没有任何相同字母的字符串长度相乘的最大值。本题的关键在于如何快速判断两个字符串是否存在相同字符。由于题目提到了所有的测试用例都只包含小写字母,因此可以用一个int(32bit)前24bit分别表示a-z的24个字符是否出现。0表示没有出现,1表示出现。然后字符串两两做"与"运算,结果为0表示互相不包含相同字符串。再采用"打擂台法"得出最大值即可。
代码:
class Solution {
public int maxProduct(String[] words) {
// 核心:如何判断两个word"交叉",采用位运算。
int[] wordBit = new int[words.length];
for(int i = 0;i<words.length;i++){
String word = words[i];
for(int j= 0 ;j<word.length();j++){
wordBit[i] |= 1<<(word.charAt(j) -'a');
}
}
int max = 0;
for(int i =0;i<wordBit.length;i++){
for(int j=i+1;j<wordBit.length;j++){
if((wordBit[i] & wordBit[j]) == 0){
// 无"交叉"
int l = words[i].length() *words[j].length();
max = max > l ? max : l;
}
}
}
return max;
}
}