Maximum Product of Word Lengths | LeetCode

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值