leetcode 1371. Find the Longest Substring Containing Vowels in Even Counts

  1. Find the Longest Substring Containing Vowels in Even Counts

用state表示[0,i]子字符串的状态,状态有5个二进制位,对应5个元音字母的奇偶性,所以一共1<<5种状态。如果[0,i]和[0,j]是相同的状态,那么[i+1,j]即为符合条件的一个子串。用state_first_pos_vec存储每个状态第一次出现的位置,初始化为字符串长+1。线性遍历字符串,不断更新状态,最大长度,每个状态的第一次出现位置。
为了减小时间开销,只有在状态改变即遇到元音字母时,才更新最大长度和状态第一次出现的位置。

class Solution 
{
public:
    int findTheLongestSubstring(string s) 
    {
        int str_len=s.length();
        char vowels[5]={'a','e','i','o','u'};
        vector<int> state_first_pos_vec(32,str_len+1);// 32个str_len+1,记录32种状态第一次出现的位置
        state_first_pos_vec[0]=-1;
        int state=0;//当前状态
        int max_len=0;
        for(int pos=0;pos<str_len;++pos)
        {
            char ch=s[pos];
            for(int vid=0;vid<5;++vid)
            {
                char vowel=vowels[vid];
                if(ch==vowel)
                {
                    //如果当前字符是一个元音字符,说明状态在这时变化,根据上一步的状态更新最大长度
                    max_len=max(max_len,pos-1-state_first_pos_vec[state]);
                    state=state^(1<<vid);
                    //状态更新后,更新这个状态的第一次出现的位置(第一次出现位置初始值为str_len+1)
                    state_first_pos_vec[state]=min(state_first_pos_vec[state],pos);
                    break;
                }
            }    
        }
        //最后的一个字符也需要考虑
        max_len=max(max_len,str_len-1-state_first_pos_vec[state]);
        return max_len;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值