位运算计算位掩码再枚举——318. 最大单词长度乘积

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算计算位掩码再枚举——318. 最大单词长度乘积相关的知识,希望对你有一定的参考价值。

题目


OJ平台

题目详解

这题,可以直接暴力解也能过,当然实际上不暴力解,也和暴力解差不多,由于题目要求两个单词不存在公共的字符,这个可以直接利用 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. 最大单词长度乘积的主要内容,如果未能解决你的问题,请参考以下文章

318. 最大单词长度乘积. 位运算

leetcode中等318最大单词长度乘积

leetcode中等318最大单词长度乘积

如何在 Swift 中为 SpriteKit 定义类别位掩码枚举?

奇怪的知识——位掩码

使用 SQLite 进行位掩码分组