Given a string array words
, find the maximum value of length(word[i]) * length(word[j])
where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.數組
題目:意思是根據給出的字符串數組,算出最大的兩個不相同字符串長度的乘積,兩個字符串的每個字符都是不同的才能算不一樣code
思路:第一反應無疑是對每個字符串進行字符次數統計,造成一個map數組,然後找出徹底不一樣字符串的,找出乘積最大的一對返回。這樣顯然是能夠解決問題,可是毫無想法可言,看看提示說用bit運算,照着先人代碼一番思考後,思路明瞭,大體是,對於一個字符串的每個字符與'a'的相對差值,將其放入一個26位的二進制數n的相應的位置,例如b就放在n的左起第二位,,,依次咱們能夠獲得每個字符串的的一個int數字,進而獲得一個關於字符串數組的int數組,根據兩個int[i]&int[j] == 0,這兩個數的二進制就是徹底相反的,對應的字符串也是徹底不一樣的,算出長度乘積,找出最大的字符串
public int maxProduct(String[] words) {
int len = words.length;
int [] bWords = new int [len];
for(int i = 0;i<len;i++){
for(int j = 0;j<words[i].length();j++){
bWords[i] |= 1 << (words[i].charAt(j) - 'a');
}
}
int max = 0;
for(int i = 0;i<len;i++){
for(int j = i+1;j<len;j++){
if((bWords[i] & bWords[j]) == 0){//特別注意& ,==兩個運算符的優先級
max = Math.max(words[i].length() * words[j].length(),max);
}
}
}
return max;
}string