leetcode 1177 构建回文串检测

该代码实现了一个解决方案,通过计算字符串每个字符的奇偶性并使用位运算来确定在给定查询范围内能否通过最多替换2k+1个字符将字符串转换为回文串。关键在于计算区间内字符奇偶性的差异,并检查这是否小于或等于可替换的字符数。
摘要由CSDN通过智能技术生成

题目链接
运用了前缀和+位运算的思想
思路:

1. 通过数字每位代表每个字母

2. 使用int数组记录以i(0<=i<len)结尾的前缀串每个字母的奇偶性,以count[i+1]表示

3. [l,r]区间的子串每个字母的奇偶性由count[r+1]^count[l]表示,

4. 使用x&=x-1快速找位中1的个数

5. k 项替换成任何小写英文字母,最多能将2k+1长度的的每个字母都为1个的字符串替换为回文串。

class Solution {
    public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
        int strLen = s.length();
        int [] count = new int[strLen+1];
        List<Boolean>result = new ArrayList<>();
        for(int i=0;i<strLen;i++) {
            count[i+1] = count[i]^(1<<(s.charAt(i)-'a'));
        }
        int queryLen = queries.length;
        for(int i=0;i<queryLen;i++) {
                int left = queries[i][0], right = queries[i][1], k = queries[i][2];
                int x= count[left]^count[right+1];
                int bit=0;
                while(x>0){
                    x&=x-1;
                    bit++;
                }
                result.add(bit<=(2*k+1));
        }
        return result;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值