leetcode_318 最大单词长度乘积

204 阅读1分钟

要求

给定一个字符串数组 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 
解释: 不存在这样的两个单词。

核心代码

class Solution:
    def maxProduct(self, words: List[str]) -> int:
        words = sorted(words,key=lambda x:-len(x))
        from collections import Counter
        dic = [Counter(item) for item in words]
        res = 0
        l = len(words)
        for i in range(l - 1):
            for j in range(i+1,l):
                flag = 0
                for char in words[i]:
                    if char in dic[j]:
                        flag = 1
                        break
                if flag == 0:
                    res = max(res,len(words[i]) * len(words[j]))
        return res

image.png

解题思路:使用双层循环的方式,注意这个题中的细节的部分,我们首先是将字符串的长度按照长在前短在后的方式进行排序,第二我们使用Counter进行字符统计,方便后续的不含公共字符的排除工作,最后,历史最佳思想,保留下来最大的乘积的值。