题意是给定一个字符数组,求出最大的两个字符串长度的积,同时,这两个字符串不能拥有相同的字母(同一个字符串允许有相同的字母),如果没有这样的两个字符串存在,则返回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.
易错点:这题的关键在于如何找到两个不含相同字母的字符串,采用的方法是利用位运算的方法,现将a-z转化为0-25,在一个字符串的set集中,0到25位数中只要出现对应字母,则对应位置1。之后建立一个字典,键是字母二进制位,值是该字符串长度,之后只要判断两个键值按位与为0,就可以判断其是否含有相同字母。
class Solution(object):
def maxProduct(self, words):
d = {}
for w in words:
mask = 0
for c in set(w):
mask |= (1 << (ord(c) - ord('a')))
d[mask] = max(d.get(mask, 0), len(w))
return max([d[x] * d[y] for x in d for y in d if not x & y] or [0])
或运算可以保存特征位(求并),与运算可以判断是否有交集。