1 题目
给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
示例 1:
输入:words = [“abcw”,“baz”,“foo”,“bar”,“xtfn”,“abcdef”]
输出:16
解释:这两个单词为 “abcw”, “xtfn”。
示例 2:
输入:words = [“a”,“ab”,“abc”,“d”,“cd”,“bcd”,“abcd”]
输出:4
解释:这两个单词为 “ab”, “cd”。
2 解析
用一个数字来代指某个包含字母的字符串:低 26 方法来代指字母 a-z 是否出现过。具体的使用是将每个字母转为比特,然后将整个字符串的所有字母比特进行与运算,得到一个唯一的数字来表示当前字符串。
判断两个字符串的字母是否有相同的字母,进行与运算,如果等于0,说明无相同的字母。此时再判断两个字符串的长度相乘的结果,选出最大的即可。
时间复杂度 O ( n 2 ) O(n^2) O(n2)
3 Python实现
class Solution:
def maxProduct(self, words: List[str]) -> int:
masks = []
for word in words:
t = 0
for w in word:
u = 1 << (ord(w) - ord('a'))
t |= u
masks.append(t)
ans = 0
for i in range(len(words)):
for j in range(i):
if (masks[i] & masks[j]) == 0:
ans = max(ans, len(words[i]) * len(words[j]))
return ans