方法一:(空间复杂度O(1),时间复杂度O(n^2))
很简单的多次遍历的方式:
public int maxProduct(String[] words) {
int res = 0;
boolean flag;
for(int i=0;i<words.length;i++){
for(int j=i+1;j<words.length;j++){
if(words[i].length()*words[j].length() > res){
flag =false;
for(int k=0;k<words[i].length();k++){
if(words[j].indexOf(words[i].charAt(k)) != -1){
flag = true;
break;
}
}
if(!flag){
res = words[i].length()*words[j].length();
}
}
}
}
return res;
}
运行结果:
方法二(空间复杂度O(n),时间复杂度O(n^2))
觉得方法一的运行速度过慢,增加了一点空间复杂度,在工程上优化了一下。创建一个数组,用int的比特位存每个字符串单词的出现情况。之后检测两个字符串有没有相同的单词只需要对两个整数做交就行了。嗯,在速度上确实提升挺多。
public int maxProduct(String[] words) {
int res = 0;
int[] wordsArray = new int[words.length];
for(int i=0;i<words.length;i++){
for(int k=0;k<words[i].length();k++){
wordsArray[i] = wordsArray[i]|1<<(words[i].charAt(k)-97);
}
}
for(int i=0;i<words.length;i++){
for(int j=i+1;j<words.length;j++){
if(words[i].length()*words[j].length() > res){
if((wordsArray[i]&wordsArray[j])==0){
res = words[i].length()*words[j].length();
}
}
}
}
return res;
}
'''
我还没想出更好的算法,先留坑吧
'''