暴力,预处理记录每个位置元音出现了多少次,然后穷举n(从size到1)
正确解法,记录元音是否出现偶次,可用状态压缩到位,然后出现了相同的状态是即满足要求,记录状态第一次出现的位置。
class Solution {
public:
char index[256];
int visit[500005][5];
void init_index() {
memset(index, -1, sizeof(char) * 256);
index['a'] = 0;
index['e'] = 1;
index['i'] = 2;
index['o'] = 3;
index['u'] = 4;
for (int i = 0; i < 5; i++)
visit[0][i] = 0;
}
int get_index(char &ch) {
return index[ch];
}
bool judge(size_t begin, size_t end) {
for (int i = 0; i < 5; i++)
if ((visit[end][i] - (begin == 0 ? 0 : visit[begin - 1][i])) & 1)
return false;
return true;
}
int findTheLongestSubstring(string s) {
if (s.size() == 0)
return 0;
else if (s.size() == 1)
return ~get_index(s[0]) ? 0 : 1;
init_index();
int tmp = get_index(s[0]);
if (~tmp)
visit[0][tmp]++;
for (size_t i = 1; i < s.size(); i++) {
for (int j = 0; j < 5; ++j)
visit[i][j] = visit[i - 1][j];
tmp = get_index(s[i]);
if (~tmp)
visit[i][tmp]++;
// for (int j = 0; j < 5; j++)
// cout << visit[i][j] << " ";
// cout << endl;
}
int ans = s.size();
while (ans > 0) {
for (size_t i = 0; i + ans <= s.size(); i++) {
size_t end = i + ans - 1;
if (judge(i, end)) {
// cout << i << " " << end << endl;
return ans;
}
}
ans--;
}
return ans;
}
};