[路飞]_程序员必刷力扣题: 318. 最大单词长度乘积

136 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

318. 最大单词长度乘积

给你一个字符串数组 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"

示例3:

输入: words = ["a","aa","aaa","aaaa"]
输出: 0 
解释 : 不存在这样的两个单词。

提示:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] 仅包含小写字母

暴力求解

思路 由题意可知,给定我们个words数组中保存这一个有一个单词word,让我们求不含相同字母的两个单词的len的乘积,求最大乘积

中单是如何判断两个word不含相同字母,最暴力的办法就是双循环去对比,这里我们通过map来记录一个单词中拥有的字母,再用另一个单词循环判断是否存在map中的单词,存在则含有相同字母,否则不含

具体做法:

  • 声明单词比较行数hasCommon,通过map记录word1中的所有字母,再循环word2中的没一个字母,判断是否存在于map中,存在这返回true,否则最后返回false
  • 双循环满足i<j,分别拿到words[i]和words[j]比较两个单词是否含有相同字母,不存在则将len的乘积与max比较取较大值重新赋值给max

循环结束得到最大的max,返回max即可

var maxProduct = function (words) {
    var max = 0
    for (var i = 0; i < words.length; i++) {
        var item1 = words[i]
        for (var j = i + 1; j < words.length; j++) {
            var item2 = words[j]
            if (!hasCommon(item1, item2)) {
                max = Math.max(max, item1.length * item2.length)
            }
        }
    }
    return max
};

function hasCommon(word1, word2) {
    var map = {}
    for (var i = 0; i < word1.length; i++) {
        map[word1[i]] = true
    }
    for (var j = 0; j < word2.length; j++) {
        var item = word2[j]
        if (map[item]) {
            return true
        }
    }
    return false
}