leetcode 剑指 Offer II 005. 单词长度的最大乘积

118 阅读1分钟

[toc] leetcode 剑指 Offer II 005. 单词长度的最大乘积

题目描述

剑指 Offer II 005. 单词长度的最大乘积

给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。

示例 1:

输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"] 输出: 16 解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符,且长度的乘积最大。 示例 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] 仅包含小写字母

解题思路

法1

位运算模拟

首先遍历字符串数组 words,对每个字符串计算一个位掩码(mask),该掩码表示该字符串中出现的字母,使用二进制的位表示。然后,将每个字符串的长度存储在 lens 数组中。

接下来,通过两个嵌套的循环遍历所有可能的字符串对(i 和 j),检查它们的位掩码是否有相同的位。如果两个位掩码的按位与操作结果为0,说明这两个字符串不包含相同的字符,此时计算它们的长度乘积,并与当前的最大乘积比较更新。

最后,返回最大乘积。

  • 时间复杂度(O())
  • 空间复杂度(O())

执行结果

法1

func maxProduct(words []string) int {
    n := len(words)
    masks := make([]int, n)
    lens := make([]int, n)
    for i, word := range words {
        mask := 0
        for _, ch := range word {
            mask |= 1 << (ch - 'a')
        }
        masks[i] = mask
        lens[i] = len(word)
    }
    
    maxProduct := 0
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            if masks[i]&masks[j] == 0 {
                product := lens[i] * lens[j]
                if product > maxProduct {
                    maxProduct = product
                }
            }
        }
    }
    
    return maxProduct
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 12 ms , 在所有 Go 提交中击败了 92.78% 的用户 内存消耗: 6.4 MB , 在所有 Go 提交中击败了 21.29% 的用户 通过测试用例: 167 / 167 炫耀一下:

本文由mdnice多平台发布