[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多平台发布