318. 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.

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

思路:利用bitmap的方法,将字符串转换为数字。对于字符串中的每个字符ch,转换为1<<(ch-'a').只要两个字符串转换之后的数字进行&操作结果为0,说明这两个字符串没有相同的字符。就可以求这两个字符串的长度的乘积,和最终要返回的值ret比较,保证ret一直是最大的。为了简化步骤,可以首先将字符串按照长度进行排序,长度较长的字符串排在前面。这样,在内部循环之中,只要满足条件可以计算乘积,内部循环就马上终止,因为后续就算计算出了乘积也一定比当前计算的乘积值要小。同样的,在外部循环之中,如果ret>=(words[i].length()*words[i].length()),那么直接终止循环,因为后面计算出的乘积一定比ret要小。

class Solution {
private:
    static bool cmp(string a,string b){
        return a.length()>b.length();
    }
    
public:
    int maxProduct(vector<string>& words) {
        int size=words.size();
        sort(words.begin(),words.end(),cmp);
        vector<int> numbers;
        for(string word:words){
            int num=0;
            for(char ch:word){
                num|=1<<(ch-'a');
            }
            numbers.push_back(num);
        }
        int ret=0;
        for(int i=0;i<size-1;i++){
            if(words[i].length()*words[i].length()<=ret)
                break;
            for(int j=i+1;j<size;j++){
                int product=(words[i].length()*words[j].length());
                if((numbers[i]&numbers[j])==0){
                    ret= max(product,ret);
                    break;
                }
            }
        }
        
        return ret;
        
    }
};
原文地址:https://www.cnblogs.com/zhoudayang/p/5247752.html