您的位置:首页 > 其它

Maximum Product of Word

2016-02-04 06:09 351 查看
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.

Analyse: As seeing this problem, I first think of brute force. For each word in the array, find other words don't share common words with it. Time exceeded.

class Solution {
public:
int maxProduct(vector<string>& words) {
int result = 0;
if(words.size() < 2) return result;

for(int i = 0; i < words.size(); i++){
for(int j = i + 1; j < words.size(); j++){
if(!hasCommon(words[i], words[j])){
int temp = (words[i].length()) * (words[j].length());
result = max(result, temp);
}
}
}
return result;
}

bool hasCommon(string s1, string s2){
if(s1.empty() || s2.empty()) return false;

for(int i = 0; i < s1.length(); i++){
for(int j = 0; j < s2.length(); j++){
if(s2[j] == s1[i])
return true;
}
}
return false;
}
};


Of course it will exceed time limit because the time complexity is O(n^4)....

Below I'll give a O(n^2) solution.

class Solution {
public:
int maxProduct(vector<string>& words) {
if(words.size() < 2) return 0;

int result = 0;
vector<int> bits(words.size(), 0);
for(int i = 0; i < words.size(); i++){
for(int j = 0; j < words[i].size(); j++)
bits[i] |= 1 << (words[i][j] - 'a');
}

for(int i = 0; i < words.size(); i++){
for(int j = i; j < words.size(); j++){
if(!(bits[j] & bits[i])){
int temp = words[i].length() * words[j].length();
result = max(result, temp);
}
}
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: