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.
将数组中的每一项字符串所包含的字母用二进制1表示,不包含的用0表示,那么每一个字符串都可以用二进制来表示,若字符串数组中的两个元素所包含的字母完全不同,那么其对应的二进制数字1对应的位置不会相同,也就是两个二进制数进行 与 操作后结果为0,这样就能得到包含不同字母的两个字符串了。
代码:
public class Solution {
public int maxProduct(String[] words) {
int [] toBinary = new int[words.length];
int result = 0;
//将数组的各字符串元素转化为二进制整型数据
for(int i = 0; i < words.length; i++){
String s = words[i];
for(int j = 0; j < s.length(); j++){//求字符串的长度用方法length()或者size()
toInt[i] |= 0x1 << (s.charAt(j) - 'a');
}
}
for(int m = 0; m < toBinary.length-1; m++){
int lenM = words[m].length();
for(int n = m+1; n < toBinary.length; n++){
int lenN = words[n].length();
if((toBinary[m] & toBinary[n]) == 0 && (lenM * lenN > result)){
result = lenM * lenN;
}
}
}
return result;
}
}