- 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;
}
};