318. Maximum Product of Word Lengths

该博客介绍了一种解决字符串数组中找到两个字符串的最大乘积,条件是这两个字符串没有共享字符的方法。通过使用长度26的二进制位来标记每个字符串中小写字母的出现情况,可以高效地检查两个字符串是否共享字符。在遍历所有字符串对的过程中,更新最大长度乘积,并记录不共享字符的字符串对的最大长度。该算法的时间复杂度为O(n^2),空间复杂度为O(n)。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值