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.
分析及解题思路
最简单是思路就是构建一个辅助方法,判断两个字符串是否含有相同字符。这样遍历所有可能的组合,记录最大值就可以得到答案。这样的复杂度我O(n^2*m^2)其中n为单词的个数,m为单词的长度,需要m^2的复杂度来比较两个单词是否含有相同字符,然后比较每个组合,这样需要n^2的复杂度。对于解这道题来说,这样的方法肯定是不能通过的,需要考虑其他的方法,来降低复杂度。
是否能够将确认两个单词是否含有相同字母的算法复杂度降低。有没有办法让只需要扫描一遍就可以确认两个单词是否含有相同字母呢。答案是有的,使用位图来记录一个单词中所出现的所有字符,然后得到的两个数相与,如果为零,说明两个单词不包含相同的字符。这样的算法复杂度是O(m+n),m,n分别为两个单词的长度。整体算法复杂度可以降为O(n*m+n^2).实现代码如下:
代码实现
int maxProduct(vector<string>& words) {
int s=words.size();
if(s==0) return 0;
int letter[s]={0};
for(int i=0; i<s; i++){ //bit manipulation
for(int j=0; j<words[i].size(); j++)
letter[i] |=(1<<(words[i][j]-'a'));
}
int maxlength=0;
for(int i=0; i<s-1; i++){
int si=words[i].size();
for(int j=i+1; j<s; j++){
int sj=words[j].size();
if((letter[i]&letter[j])==0) //have no same char
maxlength=max(maxlength,si*sj);
}
}
return maxlength;
}