【leetcode题解】【M】【10】318. Maximum Product of Word Lengths

来源:互联网 发布:kindle怎么下软件 编辑:程序博客网 时间:2024/05/29 15:08

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


最开始用 集合做,不过太慢了

然后看到可以用位操作,把每个字符串,转成一个26位的 bit串,关键是 用 | 来
然后对每个bit串,互相之间进行取 & 操作,如果为0,则说明没有重复的字母


class Solution(object):    def maxProduct(self, words):        #bit = [0]        maxx = 0        bit = [0] * len(words)        for i in xrange(len(words)):            for j in words[i]:                bit[i] |= 1 << (ord(j) - ord('a'))        #print bit        for i in xrange(len(bit)):            for j in xrange(i+1,len(bit)):                #print i,j                if len(words[i])*len(words[j])< maxx:                    continue                if bit[i] & bit[j] == 0:                    maxx = max(maxx,len(words[i])*len(words[j]))        return maxx        '''        pay attention to those like 'aaa',when using set        it's too slow        for i in xrange(len(words)):            for j in xrange(i+1,len(words)):                a = set(words[i])                b = set(words[j])                s = set(words[i] + words[j])                if len(s) ==(len(a)+len(b)):                    maxx = max(maxx,len(words[i])*len(words[j]))        '''


0 0