每个元音包含偶数次的最长子字符串

给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,’e’,’i’,’o’,’u’ ,在子字符串中都恰好出现了偶数次。

  • 输入:s = “eleetminicoworoep”

  • 输出:13
    解释:最长子字符串是 “leetminicowor” ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。

  • 输入:s = “leetcodeisgreat”

  • 输出:5
    解释:最长子字符串是 “leetc” ,其中包含 2 个 e 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var findTheLongestSubstring = function(str) {
let res = 0
let state = 0 // 前缀区间的state状态
let vowel = { a: 1, e: 2, i: 4, o: 8, u: 16 } // 对照表
let map = { 0: -1 } // map存放各个前缀区间的state
for (let i = 0; i < str.length; i++) { // 遍历str串
let char = str[i] // 获取当前遍历的字符
if (vowel[char] !== undefined) { // 当前遍历的字符是元音
state ^= vowel[char] // 求出当前前缀区间的state
if (map[state] === undefined) { // 当前state没存过
map[state] = i // 存入该state,和对应的位置
}
}
let distance = i - map[state] //求距离,即满足条件的子串长度
res = Math.max(res, distance) // 试图刷新最长记录
}
return res
};