题目描述
给定一个字符串数组 words,找到 length(word[i]) * length(word[j])
的 最大值,并且这 两个单词不含有公共字母 。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。
力扣:318. 最长单次长度乘积
输入: [“abcw” , “baz” , “foo” , “bar” , “xtfn” , “abcdef”]
输出: 16
解释: 这两个单词为 “abcw” , “xtfn”。
题目分析
废物我:暴力的解法,两两进行比较,每次比较都需要遍历两个字符串,进行判断是否包含重复字符。
大佬就是大佬,思路非常牛逼,将字符串转换成二进制串,例如 abc --> 111 = 7
, 而 abcf --> 100111 = 39
, 将所有的字符串进行预处理后,得到每个字符串对应的数字, 如果两个数字 进行位运算 & 结果为 0, 那么说明没有共同的字母,算其长度的乘积,并保留最大的值。
class Solution {
public int maxProduct(String[] words) {
int[] nums = new int[words.length];
for(int i = 0 ; i < words.length; i ++){
for(int j = 0 ; j < words[i].length() ; j ++){
nums[i] |= 1 << (words[i].charAt(j) - 'a');
}
}
int maxSn = 0;
// 暴力求解,两两进行判断
for(int i = 0 ; i < nums.length -1 ; i ++){
int num1 = nums[i];
for(int j = i + 1 ; j < nums.length ; j ++){
int num2 = nums[j];
if( (num1 & num2) == 0){
int sn = words[i].length() * words[j].length();
maxSn = Math.max(maxSn , sn);
}
}
}
return maxSn;
}
}