leetcode 每个元音包含偶数次的最长子字符串状态
压缩
int findTheLongestSubstring(string s) {
int m = s.size();
// 状态压缩用bit来表示 每一位aeiou 出现奇偶次数
// 00001 =uoiea a 出现一次
// 00011=uoiea e 出现一次
// 包偶数个则必须 是00000 状态
// 当出现[0 i]= 00000 时 [0 j] =00000 时 [i+1 j] 必定是00000
// 利用的是前缀的思想
vector<int>pos(1 << 5, INT_MAX);
int ans = 0;
int cur = 0;
// 初始状态初始化位-1 方便计算 eg: 下标为0时 0-(-1)=1
pos[0] = -1;
for (int i = 0; i < m; i++)
{
switch (s[i])
{
case 'a': cur = cur ^ 1 << 0; break;
case 'e': cur = cur ^ 1 << 1; break;
case 'i': cur = cur ^ 1 << 2; break;
case 'o': cur = cur ^ 1 << 3; break;
case 'u': cur = cur ^ 1 << 4; break;
}
// 此状态第一次出现
if (pos[cur] == INT_MAX)
{
pos[cur] = i;
}
else {
ans = max(ans, i-pos[cur]);
}
}
return ans;