**题目:**输入一个字符串数组words,请计算不包含相同字符的两个字符串word[i]和word[j]的长度, 乘积的最大值,如果所有字符串都包含至少一个相同的字符,那么返回0,假设字符串只包含英文小写字母。 分析: 方法1:用哈希表记录字符串中出现的字符, 见maxProduct方法。 方法2:用整数的二进制数位记录字符串中出现的字符。int型整数有32位,一个字符串出现的字符只需要26位,例如如果字符串包含a,则整数最右边的数是1,如果包含b那么整数的倒数第二位为1,以此类推。因此只需要与运算就可以判断字符串之间是否有重复的字符,因为如果没有重复的字符的话,两者与运算结果就是0,代码实现见方法maxProduct2。第二种方法比第一种方法效率更高,因为第一种方法判断两个字符串是否有相同的字符时可能都会判断26次,但是第二种方法只需要一次与运算就能判断是否有相同字符。
package com.wzc;
public class MaxProduct {
public static void main(String[] args) {
String[] s = {"abcw","foo","bar","fxyz","abcdef"};
int i = maxProduct(s);
System.out.println(i);
}
public static int maxProduct(String[] words){
boolean[][] flags = new boolean[words.length][26];
for (int i = 0; i < words.length; i++) {
for (char c:words[i].toCharArray()){
flags[i][c - 'a']=true;
}
}
int result = 0;
for (int i = 0; i < words.length; i++) {
for(int j=i+1;j<words.length;j++){
int k =0;
for (;k<26;k++){
if (flags[i][k]&flags[j][k]){
break;
}
}
if (k ==26){
int prod = words[i].length()*words[j].length();
result = Math.max(result,prod);
}
}
}
return result;
}
public static int maxProduct2(String[] words){
int[] flags = new int[words.length];
for (int i = 0; i < words.length; i++) {
for (char ch:words[i].toCharArray()){
flags[i] |=1 << (ch - 'a');
}
}
int result = 0;
for (int i = 0; i < words.length; i++) {
for (int j =i+1;j<words.length;j++){
if ((flags[i]&flags[j]) == 0){
int prod = words[i].length()*words[j].length();
result = Math.max(result,prod);
}
}
}
return result;
}
}
|