题目:(318. 最大单词长度乘积)
给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,
它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。
如果没有不包含相同字符的一对字符串,返回 0。
------------------------
示例:
输入: 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] 仅包含小写字母
----------------------
思考:
可以用一个 int 型整数记录某个字符串中出现的字符。如果字符串包含 'a',
那么整数最右边的数位为 1,如果字符串包含 'b',那么整数从右边起倒数第 2 位为 1。
这样做的好处就是能更快地判定两个字符串是否包含相同的字符。如果两个字符串包含相同的字符,
那么两个整数的与运算将不等于 0。反之,如果两个字符串不包含相同的字符,那么两个整数的与运算将等于 0 。
class Solution {
public int maxProduct(String[] words) {
int res = 0;
int len = words.length;
int[] nums = new int[len];
for(int i = 0; i < len; i++){
for(int j = 0, size = words[i].length(); j < size; j++){
nums[i] |= 1 << (words[i].charAt(j) - 'a');
}
}
for(int i = 0; i < len; i++){
for(int j = i + 1; j < len; j++){
if((nums[i] & nums[j]) == 0) res = Math.max(res, words[i].length() * words[j].length());
}
}
return res;
}
}