LeetCode 1542. 找出最长的超赞子字符串***

具体思想:

牛皮的状态压缩+前缀,这两个都没想到;

自己当时想用滑动窗口做,但是发现有个问题:收缩的时候无法进行判断;

例如:213213;

从21开始收缩无法判断,因为后续的和前面的相加可能是个满足要求的序列;

题解的思想:
使用一个9 bit的序列计算每位上是偶数还是奇数,并且使用map记录该状态出现的位置;

这里很多题解都没有讲清楚:

  1. 如果不同节点的两个状态相同,则说明,其间必定是回文满足,并且,他们的个数必定是偶数;
    例如:1,1,2,2和1,1,1,2,2,2,两者在1和2位上的奇偶状态相同,则必定他们的每位字符差是2的倍数,所以必定满足;
  2. 如果两个状态只有一位不同,也就是说只有一位奇偶不同,则说明个数必为奇数;
    例如:1,1,2和1,1,1,2,两者在一位上不同,则只需要调整该位使其差距是2的倍数,即可构成回文子串;

总而言之,状态需要满上述两种情况,才可以保证他们中间相隔的字符满足偶数(成对出现),或者奇数(只有一个不成对,剩下的都成对出现);

具体代码:

class Solution {
public:
    int longestAwesome(string s) {
        unordered_map<int,int>ump;
        ump[0]=0;
        int ret=0;
        int qz=0;
        for(int i=1;i<=s.size();i++){
            int num=s[i]-'0';
            qz^=1<<i;
            if(ump.count(qz)){
                ret=max(ret,i-ump[qz]);
            }else{
                ump[qz]=i;
            }
            for(int i=0;i<10;i++){
                int temp=qz^(1<<i);
                if(ump.count(temp)){
                    ret=max(ret,i-ump[temp]);
                }
            }
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值