leetcode第318题,要求在一串字符串中找出没有重复字母的单词,并且其长度之积最大。
tag是位操作,一开始没明白什么意思,后来参考后发现,单词全部由小写字母组成,因此只有26种可能,因此可以设置一个26位的数字来记录该位上字母是否出现,两个单词如果有相同的字母,那么这两个单词对应的代表的数字当按位与操作之后一定不是零。这样就可以就可以判断是否有重复字母了,然后遍历找出最大长度积就可以了,复杂度为o(n2)
class Solution(object):
def maxProduct(self, words):
"""
:type words: List[str]
:rtype: int
"""
nums = []
n = len(words)
maxlen = 0
for word in words:
nums.append(sum(1<<(ord(char)-ord('a')) for char in set(word)))
for i in range(n):
for j in range(n):
if not (nums[i] & nums[j]):
maxlen = max(len(words[i])*len(words[j]),maxlen)
return maxlen