leetcode 318. 最大单词长度乘积

给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。

示例 1:

输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16 
解释: 这两个单词为 "abcw", "xtfn"。

示例 2:

输入: ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4 
解释: 这两个单词为 "ab", "cd"。

示例 3:

输入: ["a","aa","aaa","aaaa"]
输出: 0 
解释: 不存在这样的两个单词。
  • my solution (slower)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution:
    def maxProduct(self, words):
    """
    :type words: List[str]
    :rtype: int
    """
    d = {}
    for w in words:
    d[w] = set(w)

    ans = 0
    for i in range(len(words)-1):
    for j in range(i+1, len(words)):
    if not (d[words[i]] & d[words[j]]):
    ans = max(ans, len(words[i]) * len(words[j]))
    return ans
  • a faster solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def maxProduct(self, words):
"""
:type words: List[str]
:rtype: int
"""
d = {}
for word in words:
mask = 0
for char in set(word):
mask |= (1 << (ord(char) - 97))
d[mask] = max(d.get(mask, 0), len(word))

return max([d[x] * d[y] for x in d for y in d if not x & y] or [0])