题意

给你字符串 s 和整数 k,返回 s 中长度为 k 的子字符串里,元音字母(a e i o u)的最大数目。

思路

这道题是固定窗口大小的滑动窗口入门题,核心就三步:

  1. 窗口右端扩张:遍历字符串,遇到元音就 vowelCount++
  2. 窗口未成形就跳过:当 i < k - 1 时,窗口还没填满,不更新答案。
  3. 窗口左端收缩:窗口满了之后,先更新答案,再把左边即将滑出的字符从计数中减去。

一个小优化:如果 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