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]))
'''