位运算计算位掩码再枚举——318. 最大单词长度乘积
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算计算位掩码再枚举——318. 最大单词长度乘积相关的知识,希望对你有一定的参考价值。
题目
题目详解
这题,可以直接暴力解也能过,当然实际上不暴力解,也和暴力解差不多,由于题目要求两个单词不存在公共的字符,这个可以直接利用 bitmap
进行预处理解决!
怎么预处理解决?由于最多就26个英文字母,所以直接可以用一个 int 作为每个单词的 bitmap,我们称这个为位掩码,因为你会发现,如果两个单词不存在交集字符,则两者的位掩码相与,则必定为0。
有了 bitmap
快速辅助判断两个单词是否有交集字母,则就只需要安安心心的枚举即可!
解题代码
class Solution {
public:
int maxProduct(vector<string>& words) {
int n = words.size();
int bitmap[n];
memset(bitmap,0,sizeof bitmap);
for(int i=0;i<n;i++){//建立bitmap
for(auto&&ch:words[i]){
int ipx = ch-'a';
if(bitmap[i]&(1<<ipx))
continue;
bitmap[i] |= 1<<ipx;
}
}
//枚举两个数
size_t res = 0;
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) {
//根据bitmap,直接相与,如果得到0,则说明不存在公共字母
if((bitmap[i]&bitmap[j])==0)
res = max(res,words[i].size()*words[j].size());
}
}
return res;
}
};
以上是关于位运算计算位掩码再枚举——318. 最大单词长度乘积的主要内容,如果未能解决你的问题,请参考以下文章