时间复杂度 O(N)
额外空间复杂度 O(1)
class Solution {
public int findTheLongestSubstring(String s) {
// 记录结果,即下标差
int res = 0;
// 记录截止遍历位,元音字符串 "aeiou" 每一种 bit mask 出现的最小下标 数组大小为 2^5
int seen[] = new int[32];
// 初始位置 bit mask 为 0,即空串
int mask = 0;
int n = s.length();
// 初始化下标值
Arrays.fill(seen, n);
// 表示空串对应 bit mask 出现的最小下标为 -1
seen[0] = -1;
// 从头到尾循环遍历字符串
for (int i = 0; i < n; i++) {
// 如果当前字符为元音,翻转当前字符对应 bit 位,得到当前元音字符串 "aeiou" 对应 bit mask
mask ^= 1 << ("aeiou".indexOf(s.charAt(i)) + 1 ) >> 1;
// 对应全为偶数的下标差
res = Math.max(res, i - seen[mask]);
// 更新 bit mask 对应的最小下标
seen[mask] = Math.min(seen[mask], i);
}
return res;
}
}