用 int 做字符串 signature
Maximum Product of Word Lengths
这题本身不难,就是循环枚举。
关键点是“已知字母为 a-z,如何高效检查两个String是否有重复字符”
简单粗暴的方法就是 int[26] 的字母 hash,两个字符串之间用 26 次比较操作检查一下。
但是考虑到只有 26 种可能的时候,我们可以直接用 32-bit int 的 bit 来表示同样的信息,而且 int 之间可以直接通过 OR 和 AND 的位运算操作,大大减少每次比较所需要的时间。
注意点1:重复字符不要重复设,所以无脑加到 sig 上是不行的,要用 'OR'
犯错: 1<<(c-'a') 误写为 (c-'a') <<1
public class Solution {
public int maxProduct(String[] words) {
List<Integer> list = new ArrayList<Integer>();
for(String word : words){
int sig = get(word);
list.add(sig);
}
int max = 0;
for(int i=0;i<words.length;i++)
for(int j=i+1;j<words.length;j++){
if((list.get(i)&list.get(j))==0)
max = Math.max(max, words[i].length()*words[j].length());
}
return max;
}
public int get(String word){
char[] arr = word.toCharArray();
int num = 0;
for(char c:arr){
num=num|(1<<(c-'a'));
}
return num;
}
}