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.
题意:求,不包含相同字符的两个string的最大长度积;
思路:
如何降低判断两string是否包含相同字符的开销???
用bit来表示string元素中a-z每个字符是否出现;
1 class Solution { 2 public: 3 int maxProduct(vector<string>& words) { 4 int len = words.size(); 5 if(len==0) 6 return 0; 7 vector<int> v(len,0); 8 vector<int> l(len,0); 9 for(int i=0;i<len;i++) 10 { 11 string tstr = words[i]; 12 int tlen = tstr.length(); 13 l[i] = tlen; 14 for(int j=0;j<tlen;j++) 15 { 16 int ttmp = 1<<(tstr[j]-'a'); 17 v[i] |= ttmp; 18 } 19 } 20 21 int ans = 0; 22 for(int i=0;i<len;i++) 23 { 24 for(int j=i+1;j<len;j++) 25 { 26 int t2 = v[i]&v[j]; 27 if(t2!=0) 28 continue; 29 int tmp = l[i]*l[j]; 30 if(tmp>ans) 31 ans = tmp; 32 } 33 } 34 return ans; 35 } 36 };