leetcode 5337 每个元音包含偶数次的最长子字符串(状压,搜索)

题目大意:

有字符串str,我们抽取连续字串,规定连续字串的a,e,i,o,u出现的次数必须是偶数次(可以是0次),问我们最长可以截取多长这个字符串。

length(str)<=1e5

解题思路:

这题我们需要先对状态进行编码,元音字母分别对应bitset的0到4位,每次遇到元音字母,我们就在相对应的位置取反。当我们遇到两个相同的状态时,这两个状态的位置相减就是合法的字符串,要使得这个字符串最长,我们只需要记录下第一次遇到这个状态的位置就可以了。

class Solution {
public:
    int findTheLongestSubstring(string s) {
        map<char,int> mm1;
        map<int,int> mm2;
        mm1['a']=1;
        mm1['e']=2;
        mm1['i']=4;
        mm1['o']=8;
        mm1['u']=16;
        int n=s.size();
        mm2[0]=-1;
        int ans=0;
        int state=0;
        for(int i=0;i<n;i++){
            state^=mm1[s[i]];
            if(mm2.count(state)){
                ans=max(ans,i-mm2[state]);
            }else mm2[state]=i;
        }
        return ans;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值