这题初见很容易以为是滑动窗口题,其实并不行。虽然只有中等,但是真实难度要比很多困难题都高。
首先,将a e i o u五个字符出现的奇数次和偶数次定义为一种状态,比如00101表示a e i o u五个字符分别出现偶数次偶数次奇数次偶数次奇数次。然后用state[i]表示前i个字符的状态。那么,符合要求的子串一定是夹在两种相同状态之间的。分析到这,其余的就比较简单了。
class Solution {
public:
int findTheLongestSubstring(string s) {
unordered_map<char,int> mp;
mp['a']=0,mp['e']=1,mp['i']=2,mp['o']=3,mp['u']=4;
int st[500005]={0},n=s.size(),ans=0;
for(int i=1;i<=n;i++)
{
if(mp.count(s[i-1]))
{
st[i]=st[i-1]^(1<<mp[s[i-1]]);
}else st[i]=st[i-1];
}
int pos[1<<6];
memset(pos,-1,sizeof pos);
pos[0]=0;
for(int i=0;i<n;i++)
{
int x=st[i+1];
if(pos[x]==-1) pos[x]=i+1;
else ans=max(ans,i+1-pos[x]);
}
return ans;
}
};