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.
分析:
由于都是小写,可以设置26位的bitset来保存每一个string,对每个string若存在某字母p,就将p-a位置为1,这样任意两个string若完全不同,则相与比为0.
简单做法是O(n^2)的复杂度,我觉得应该有更简单的,就是排序后,从大到小的求。
但实现起来感觉有一定难度。
代码:
class Solution {
public:
int maxProduct(vector<string>& words) {
vector< bitset<26> > num(words.size(),bitset<26>(0));
for(int i=0;i<words.size();++i)
{
for(const auto & q:words[i])
{
num[i].set(q-'a');
}
}
int result=0;
for(int i=0;i<num.size();++i)
{
for(int j=0;j<i;++j)
{
if((num[i]&num[j])==0)
{
int len=words[i].size()*words[j].size();
result=max(result,len);
}
}
}
return result;
}
};