记一道位运算的题目
给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。链接:https://leetcode-cn.com/problems/aseY1I
其中一个用法 ,一个字符串所包含的字符可以表示为二进制的形式。如 abc 就是 111 , bcd就是1110.
对于bcd tmp |= 1<< b-'a' tmp |= 1 << c-'a' tmp |= 1<< d-'a'; 最终 bcd所包含字符的二进制表示形式就是 1110
class Solution {
public int maxProduct(String[] words) {
int len = words.length;
int res = 0;
int[] mask = new int[len];//将每一个字符串所包含的字符用二进制编码的形式表示出来
for(int i = 0; i < len; i ++){
int tmp = 0;
for(char c: words[i].toCharArray()){
tmp |= 1 << (c - 'a');
}
mask[i] = tmp;
}
for(int i = 0; i < len-1 ; i ++){
for(int j = i+1; j < len; j ++){
if((mask[i] & mask[j]) != 0){
continue;
}else{
int n = words[i].length()*words[j].length();
res = n > res? n : res;
}
}
}
return res;
}
}