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.
class Solution {
public:
int maxProduct(vector<string>& words) {
int length=words.size();
int * wordsMap= new int[length];
memset(wordsMap, 0, sizeof(int)*length);
for(int i=0;i<length;i++){
for(int j=0;j<words[i].size();j++){
wordsMap[i] = wordsMap[i] | (0x00000001<<(words[i].at(j)-'a'));
}
}
int maxSum=0;
for(int i=0;i<length;i++){
for(int j=i+1;j<length;j++){
if((wordsMap[i] & wordsMap[j])==0){
if(words[i].size()*words[j].size()>maxSum){
maxSum=words[i].size()*words[j].size();
}
}
}
}
return maxSum;
}
};
万万没想到这个代码还是挺快的
思想就是将每一个字符串换成对应的32位Int.
因为只有26个字母。所以出现的字母在32位的int中的一位标志着这个字字母有没有出现过。
最后再用一个O(n^2)的循环,比对这些int是否有相同的位,如果有就是出现了同样的字母
该逻辑用逻辑与实现
预处理是O(n*m) m为字符串长度
判断是O(n^2)