qc状态压缩(位运算)

8 篇文章 0 订阅
7 篇文章 0 订阅

文章目录


例题

力扣 1684. 统计一致字符串的数目

在这里插入图片描述


题解

由于 allowed 字符都是不相同的,那么可以取一个 int 类型整数的后 26 位作为标记,比如如果 allowed = “ac” ,那么可以转为一个数:00…000101 (26位),最低位 1 表示 ‘a’ ,另一个 1 表示 ‘c’ ,这样就可以表示一个字符都不相同的字符串 allowed 了,它具有字符 (char)(0 + ‘a’) 以及 (char)(2 + ‘a’) ,将 allowed 对应的数称为 ans 。

那么将 words 里的字符串都这样处理,都会获得一个对应的数 res。
当求得一个字符串 word 中的所有字符都出现于 allowed 时,就相当于 word 所对应的数 res 二进制位为 1 的那些位,在 ans 上这些位也都为 1 。
故,如果需要判断 res 的每一个为 1 的位,是否在 ans 上也为 1 ,只需要 res & ans ,来判断结果是否为 res 。
如果不为 res,则说明 res 上某一个为 1 的位,与 ans 对应位上的 0 所相与为 0 ,其总和将小于 res 而非等于 res。

class Solution {
    public int countConsistentStrings(String allowed, String[] words) {
        int ans = solve(allowed);
        int total = 0;
        for (String word : words) {
            int res = solve(word);
            if((res & ans) == res){
                total ++;
            }
        }
        return total;
    }

    public int solve(String s) {
        int ans = 0;
        for(int i = 0; i < s.length(); i++) {
            int x = s.charAt(i) - 'a';
            ans |= (1 << x);
        }
        return ans;
    }
}

作者:zheng-rong-zhu
链接:https://leetcode-cn.com/problems/count-the-number-of-consistent-strings/solution/zhuang-tai-ya-suo-wei-yun-suan-by-zheng-xl00a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注:

java中有三种移位运算符:

‘<<’ : 左移运算符,num << 1,相当于num乘以2
‘>>’ : 右移运算符,num >> 1,相当于num除以2
‘>>>’ : 无符号右移,忽略符号位,空位都以0补齐

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值