LeetCode 1456. 定长子串中元音的最大数目

本文最后更新于 2025年4月21日 凌晨

LeetCode 1456. 定长子串中元音的最大数目

给你字符串 s 和整数 k

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(a, e, i, o, u)。


典型的滑动窗口题目,窗口长度为 k,统计窗口中原音字母数字的最大值。当窗口移动时,不用每次都去计算窗口中所有的元音字母数 sum,只要判断右侧进入的字母是不是元音,是则 sum + 1,然后判断左侧出窗口的字母是不是元音,是则 sum - 1,最后更新一下最大值 maxSum。

这里先让窗口的右侧进入数组,减少一部分初始化的工作量,同时也可以处理窗口长度大于数组的情况。

class Solution {
    public int maxVowels(String s, int k) {
        char chars[] = s.toCharArray();
        boolean v[] = new boolean[s.length()];

        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
                v[i] = true;
            }
        }

        int sum = 0, maxSum = -1;
        for (int i = 0; i < chars.length; i++) {
            // right 表示上一次进窗口的字母位置
            int right = i;
            // left 表示上一次出窗口的字母位置
            int left = right - k;

            // 进窗口的字母是元音,总数+1
            if (v[right]) {
                sum++;
            }

            // 出窗口的字母位置 < 0 时,窗口还未完全在数组内,跳过处理,只统计进窗口元素即可。
            // 出窗口的字母位置是在数组内部,总数-1。
            if (left >= 0 && v[left]) {
                sum--;
            }

            maxSum = Math.max(sum, maxSum);
        }

        return maxSum;
    }
}

LeetCode 1456. 定长子串中元音的最大数目
https://blog.avezah.com/leetcode/lc1456/
作者
avezah
发布于
2025年3月23日
许可协议