给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。
示例 1:
输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符,且长度的乘积最大。
看了下没啥比较好的思路,硬要写的话会非常复杂。
class Solution {
public int maxProduct(String[] words) {
int result=0;
for(int i=0;i<words.length;i++){
for(int j=i+1;j<words.length;j++){
if(isSame(words[i],words[j])==false){
if(words[i].length()*words[j].length()>result){
result=words[i].length()*words[j].length();
}
}
}
}
return result;
}
private boolean isSame(String a,String b) {
boolean same=false;
char[]arrA = a.toCharArray();
char[]arrB = b.toCharArray();
for(int i=0;i<arrA.length;i++){
for(int j=0;j<arrB.length;j++){
if(arrA[i]==arrB[j]){
same=true;
System.out.println("same"+arrA[i]);break;
}
}
}
return same;
}
}
这样写时间会超出限制,看一看评论区大佬写法。
对于验证两个单词长度的最大乘积,首先需要每两个单词都比较一遍,这个就没办法避免了……
考虑加快判断两个字符串是否包含相同的字符:
首先,需要一个单词中的每一个字符都保存起来
之后,比较依次比较两个单词中每一个字符,确定或者都没出现过,或者只有一个单词中出现过
考虑二进制值 与 的特性, 0 & 0 = 0, 0 & 1 = 1 & 0 = 0, 1 & 1 =1 ,刚好符合要求
用一个数字二进制表示中的每一位记录一个字母是否出现,例如,字符串 ac 可以用 00000000 00000000 00000000 00000101 = 3 表示
将每一个字符串中字母是否出现均用一个数字表示表示出来,当比较两个字符串是否存在相同字母时,使用 num1 & num2 == 0 就可以轻易判断出来了(๑╹◡╹)ノ"""public int maxProduct(String[] words) { int[] wordCode = this.initWordCode(words); int result = 0; for (int i = 0, end = words.length; i < end; i++) { for (int j = i + 1; j < end; j++) { if ((wordCode[i] & wordCode[j]) == 0) { result = Math.max(result, words[i].length() * words[j].length()); } } } return result; } private int[] initWordCode(String[] words) { int[] wordCode = new int[words.length]; for (int i = 0, end = words.length; i < end; i++) { for (char letter : words[i].toCharArray()) { wordCode[i] |= (1 << (letter - 'a')); } } return wordCode; } 作者:huaLuoYueQue 链接:https://leetcode-cn.com/problems/aseY1I/solution/hua-luo-yue-que-bei-li-yong-che-di-de-er-loai/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。