题目描述
单词长度的最大乘积
示例 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
-
解题思路
左思右想只能想到暴力解法,用HashSet去重,判交集。
效率太低了。
看题解
二进制,字符串
这思路!
因为字符串中的字符每个都是26个字母中的一个,而int是32位的,那就可以用int的位的0/1表示是否存在该字母。先一次遍历将字符串用按位或运算转为int数。 用按位与运算判断两个数是否有交集。顺序遍历求Max实现代码
public int maxProduct(String[] words) {
int[] wordsArray = new int[words.length];
//int数转换
for (int i = 0, end = words.length; i < end; i++) {
for (char letter : words[i].toCharArray()) {
wordsArray[i] |= (1 << (letter - 'a'));
}
}
int product = 0;
for (int i = 0, end = words.length; i < end; i++) {
for (int j = i + 1; j < end; j++) {
if ((wordsArray[i] & wordsArray[j]) == 0) {
product = Math.max(product, words[i].length() * words[j].length());
}
}
}
return product;
}
作者:huaLuoYueQue
链接:https://leetcode-cn.com/problems/aseY1I/solution/hua-luo-yue-que-bei-li-yong-che-di-de-er-loai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间及空间复杂度分析
真正耗时的操作在于如何判断两个字符串存在,用二进制算是最高效率的方式,时间复杂度O(n2)
空间复杂度只需要O(n)拓展思路