318. Maximum Product of Word Lengths
Medium
2874113Add to ListShare
Given a string array words
, return the maximum value of length(word[i]) * length(word[j])
where the two words do not share common letters. If no such two words exist, return 0
.
Example 1:
Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"] Output: 16 Explanation: The two words can be "abcw", "xtfn".
Example 2:
Input: words = ["a","ab","abc","d","cd","bcd","abcd"] Output: 4 Explanation: The two words can be "ab", "cd".
Example 3:
Input: words = ["a","aa","aaa","aaaa"] Output: 0 Explanation: No such pair of words.
Constraints:
2 <= words.length <= 1000
1 <= words[i].length <= 1000
words[i]
consists only of lowercase English letters.
class Solution:
def maxProduct(self, words: List[str]) -> int:
"""
assert Solution().maxProduct(["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]) == 16
assert Solution().maxProduct(["a", "ab", "abc", "d", "cd", "bcd", "abcd"]) == 4
assert Solution().maxProduct(["a", "aa", "aaa", "aaaa"]) == 0
assert Solution().maxProduct(
["ccd", "accaceddeeeaefc", "bcaffa", "bbcfafbb", "accacfebbabbeedfbfdb", "beddecbffcdaededdaefdedfdea", "cf",
"ddafdcbd", "bbafacebacaefdaffccebddff", "ebccffcddbeddccacceccaec", "becfbfdccdfdeadfbfaddbcded",
"cbabeaaeabefedbaeaedc", "dfadbbdbead", "cafaefdcd", "eccdbfceafeeeacfcddc", "dbabbcdbb", "abfbfbffcbebde",
"cfaadaa", "fc", "faebcabb", "adbacebabcaaccbdeaffff", "aeaefccf", "dbacbeeabdbcdfccabebaecfef",
"ecdadeefcaddffaececffa", "defcabf", "abbcecbccbdaebaecaefabed", "dfeeebcbaaefc", "aecccbcbbdddb", "dcfabacec",
"fccfbacbacddeaaea", "dfdbfacbacbecb", "cbfeebdbfecb", "cffaacacbde", "aafd", "bdcebbbebd", "afeffadcfcdacfba",
"dafeefbcdfaffcfacee", "dcbbebfbedafedcdbab", "cafaf", "bcbcccfdebdd", "efaaaacccff", "cffbead",
"ebcfccfcddffdec", "fffdfdcec", "beeafefbdfa", "cdfdbccfbaaeffcabab", "ddadcbabbcb",
"decfaeabbecebaebeaddedae", "cdcbfffbebae", "aeccefcbcbbddfdc", "ffefedaf", "cddbabccafaffeafeedcbedbdad",
"eddeeccfedcefadfdfebfacb", "aca", "ffdcafaddcddf", "ef", "bbbbffe", "ffccfebabaadcffacbbb",
"cbdeddfddffacbeeeebafebabda", "ddeecb", "cffdc", "edcffcebadf", "becbcadcafddcfbbeeddbfffcab",
"abcbaceeaeaddd", "cfeffceebfaeefadaaccfa", "eaccddb", "caeafbfafecd", "becaafdbaadbfecfdfde",
"ecabaaeafbfbcbadaac", "bdcdffcfaeebeedfdfddfaf", "dbbfbaeecbfcdebad", "cceecddeeecdbde", "beec",
"adbcfdbfdbccdcffffbcffbec", "bbbbfe", "cdaedaeaad", "dadbfeafadd", "fcacaaebcedfbfbcddfc", "ceecfedceac",
"dada", "ccfdaeffbcfcc", "eadddbbbdfa", "beb", "fcaaedadabbbeacabefdabe", "dfcddeeffbeec",
"defbdbeffebfceaedffbfee", "cffadadfbaebfdbadebc", "fbbadfccbeffbdeabecc", "bdabbffeefeccb", "bdeeddc",
"afcbacdeefbcecff", "cfeaebbbadacbced", "edfddfedbcfecfedb", "faed", "cbcdccfcbdebabc", "efb", "dbddadfcddbd",
"fbaefdfebeeacbdfbdcdddcbefc", "cbbfaccdbffde", "adbcabaffebdffad"]) == 39
参考别人的解题思路:用长度26位的二进制位对应标记字符串26个小写字母的出现情况,
当与另一个数与后为0即不存在相同字符,则更新最大长度
时间复杂度:O(n^2),空间复杂度:O(n)
"""
# 标记相同字符的串的最大长度
wordSizes = {}
result = 0
for word in words:
mask, size = 0, len(word)
for c in word:
# 标记字符出现
mask |= 1 << (ord(c) - ord("a"))
for k, v in wordSizes.items():
if k & mask == 0:
# 2个字符串不重合
result = max(result, size * v)
# 更新出现相同字符的串的最大长度
if wordSizes.get(mask) is None:
wordSizes[mask] = size
else:
wordSizes[mask] = max(wordSizes[mask], size)
return result