由于words只包含了26个小写字母,而int型有32位,可以用26位表示一个单词中是否出现某个小写字母。比如,"a"可以表示为1,"ab"表示为11。这样在检查两个单词是否有相同字母时,只需要将它们对应的数值作按位与操作,查看结果是否为0即可。
class Solution(object):
def maxProduct(self, words):
"""
:type words: List[str]
:rtype: int
"""
word_idx = {}
for i in range(26):
word_idx[chr(97+i)] = 1 << i
nums = []
for i, word in enumerate(words):
temp = 0
for w in word:
if temp & word_idx[w] == 0:
temp += word_idx[w]
nums.append(temp)
result = 0
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] & nums[j] == 0:
result = max(result, len(words[i]) * len(words[j]))
return result