LeetCode318 最大单词长度乘积-----位运算
题目表述
给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
示例:
输入: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "xtfn"。
位运算
-
从题目得知,words数组是只包含小写字母的,所以共有26个小写字母,可以用int类型的数组来存储words数组中的每个字符串,因为int类型占32位,所以可以用0-25来表示字符。
-
新建一个masks int型数组,代表每个string字符串所包含的字符。
-
将当前字符-'a' 代表1左移的位数,也即使占32位int型中的第几位。并与其他字符做|(或运算),将字符串中所有的字符保存下来。
-
双重循环遍历masks数组,依次做&(与)运算,如果与运算结果为0,则说明两字符串没有相同字符,计算两字符串长度乘积,并于最长字符串比较更新
class Solution {
public int maxProduct(String[] words) {
int[] masks = new int[words.length];
int res = 0;
for(int i = 0; i < words.length; i++){
for(int j = 0; j < words[i].length();j++){
masks[i] |= 1 << words[i].charAt(j) - 'a';
}
}
for(int i = 0; i < words.length; i++){
int temp = masks[i];
for(int j = i; j < words.length;j++){
if((temp & masks[j]) == 0){
res = Math.max(words[i].length() * words[j].length(),res);
}
}
}
return res;
}
}