题目链接: https://leetcode.com/problems/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.
思路: 如果暴力做的话时间复杂度会很高. 有一种极为巧妙的方法, 就是将每个字符串通过移位操作变成一个整数, 即将每一个字母会变成整数的一个二进制位. 这样通过位操作&来快速判断两个字符串是否有交集. 真是非常聪明的做法.
代码如下:
class Solution {
public:
int maxProduct(vector<string>& words) {
unordered_map<int, int> hash;
for(auto val: words)
{
int tem= 0;
for(auto ch: val) tem |= (1<<(ch-'a'));
if(!hash.count(tem) || hash[tem] < val.size())
hash[tem] = val.size();
}
int Max = 0;
for(auto val1: hash)
for(auto val2: hash)
if((val1.first&val2.first) ==0)
Max = max(Max, val1.second*val2.second);
return Max;
}
};
参考: https://leetcode.com/discuss/82920/java-easy-version-to-understand