暴力,预处理记录每个位置元音出现了多少次,然后穷举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;
}
};
暴力预处理:寻找最长元音偶数出现子串
本文介绍了一种高效的算法,通过预先计算字符串中每个位置元音出现的次数,并使用状态压缩技巧判断连续子串中元音是否出现偶数次,以找到最长满足条件的子串。Solution类实现包括初始化索引、获取字符索引、判断子串和查找最长子串功能。

被折叠的 条评论
为什么被折叠?



