位运算计算位掩码再枚举——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;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_50945504/article/details/121375350