题意
给你字符串 s 和整数 k,返回 s 中长度为 k 的子字符串里,元音字母(a e i o u)的最大数目。
思路
这道题是固定窗口大小的滑动窗口入门题,核心就三步:
- 窗口右端扩张:遍历字符串,遇到元音就
vowelCount++。 - 窗口未成形就跳过:当
i < k - 1时,窗口还没填满,不更新答案。 - 窗口左端收缩:窗口满了之后,先更新答案,再把左边即将滑出的字符从计数中减去。
一个小优化:如果 ans === k,说明窗口里全是元音,不可能更大了,直接 break。
代码
function maxVowels(s: string, k: number): number {
let ans = 0;
let vowelCount = 0;
const VOWELS = ['a', 'e', 'i', 'o', 'u'];
for (let i = 0; i < s.length; i++) {
// 加:右端字符进入窗口
if (VOWELS.includes(s[i])) {
vowelCount++;
}
let left = i - k + 1;
if (left < 0) {
continue;
}
// 更新答案
ans = Math.max(ans, vowelCount);
if (ans === k) {
break;
}
// 减:左端字符离开窗口
let out = s[left];
if (VOWELS.includes(out)) {
vowelCount--;
}
}
return ans;
};复杂度
- 时间复杂度:,每个字符最多进出窗口各一次。
- 空间复杂度:,只用了几个变量。
滑动窗口模板小结
固定窗口滑动窗口的一般套路:
for 右端 in 遍历:
加入右端元素到窗口状态
if 窗口未满:
continue
更新答案
移除左端元素,左端右移
关键点在于「先加后减」——先把右端元素算进来,再判断是否需要移除左端,保证窗口大小始终为 k。