题目描述:
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。
示例 1:
输入:s = “eleetminicoworoep”
输出:13
解释:最长子字符串是 “leetminicowor” ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
示例 2:
输入:s = “leetcodeisgreat”
输出:5
解释:最长子字符串是 “leetc” ,其中包含 2 个 e 。
示例 3:
输入:s = “bcbcbc”
输出:6
解释:这个示例中,字符串 “bcbcbc” 本身就是最长的,因为所有的元音 a,e,i,o,u 都出现了 0 次。
提示:
1 <= s.length <= 5 x 10^5
s 只包含小写英文字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题目和之前的求和题目是类似的
这里很显然有32个状态,使用动态规划,dp[i]表示出现出现i状态的最短小下标
class Solution {
public int findTheLongestSubstring(String s) {
int n = s.length(), res = 0;
int[] dp = new int[32];
int cur = 0;
Arrays.fill(dp, n);
dp[0] = -1;
for(int i = 0 ; i < n ; i++){
int id = getIndex(s.charAt(i));
if(id >= 0) {
cur ^= (1 << id);
}
dp[cur] = Math.min(dp[cur], i);
res = Math.max(res, i - dp[cur]);
}
return res;
}
private int getIndex(char c){
if(c == 'a'){
return 0;
} else if(c == 'e'){
return 1;
} else if(c == 'i'){
return 2;
} else if(c == 'o'){
return 3;
} else if(c == 'u'){
return 4;
} else {
return -1;
}
}
}