Maximum Product of Word

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. 

 1 class Solution {
 2 public:
 3     int maxProduct(vector<string>& words) {
 4         int result = 0;
 5         if(words.size() < 2) return result;
 6         
 7         for(int i = 0; i < words.size(); i++){
 8             for(int j = i + 1; j < words.size(); j++){
 9                 if(!hasCommon(words[i], words[j])){
10                     int temp = (words[i].length()) * (words[j].length());
11                     result = max(result, temp);
12                 }
13             }
14         }
15         return result;
16     }
17     
18     bool hasCommon(string s1, string s2){
19         if(s1.empty() || s2.empty()) return false;
20         
21         for(int i = 0; i < s1.length(); i++){
22             for(int j = 0; j < s2.length(); j++){
23                 if(s2[j] == s1[i])
24                     return true;
25             }
26         }
27         return false;
28     }
29 };

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

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

 1 class Solution {
 2 public:
 3     int maxProduct(vector<string>& words) {
 4         if(words.size() < 2) return 0;
 5         
 6         int result = 0;
 7         vector<int> bits(words.size(), 0);
 8         for(int i = 0; i < words.size(); i++){
 9             for(int j = 0; j < words[i].size(); j++)
10                 bits[i] |= 1 << (words[i][j] - 'a');
11         }
12         
13         for(int i = 0; i < words.size(); i++){
14             for(int j = i; j < words.size(); j++){
15                 if(!(bits[j] & bits[i])){
16                     int temp = words[i].length() * words[j].length(); 
17                     result = max(result, temp);
18                 }
19             }
20         }
21         return result;
22     }
23 };
原文地址:https://www.cnblogs.com/amazingzoe/p/5176660.html