题目:
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.
思路:
这道题目如果用朴素方法求解估计会超时。有一个比较巧妙的思路就是将一个word根据其组成的字母,映射到一个正数。由于int是32位,所以我们可以用0-25位分别表示是否出现了a..., z。这样最后只需要依次按位与操作就可以确定两个单词是否包含重复字符。
代码:
class Solution {
public:
int maxProduct(vector<string>& words) {
unordered_map<int, int> hash;
for(int i = 0; i < words.size(); ++i) {
int key = 0;
for(int j = 0; j < words[i].size(); ++j) {
key |= (1 << (words[i][j] - 'a'));
}
if(hash.count(key) == 0 || hash[key] < words[i].length()) {
hash[key] = words[i].length(); // update to the maximum word length (e.g., ab vs aabb)
}
}
int max_product = 0;
for(auto v1 : hash) {
for(auto v2 : hash) {
if(v1 == v2) { // exclude the same word
continue;
}
if((v1.first & v2.first) == 0) { // try to find if the two words have common characters
max_product = max(max_product, v1.second * v2.second);
}
}
}
return max_product;
}
};