Skip to content

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

给你字符串 s 和整数 k 。

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

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

示例 1:
输入:s = "abciiidef", k = 3 输出:3
解释:子字符串 "iii" 包含 3 个元音字母。

示例 2:
输入:s = "aeiou", k = 2
输出:2
解释:任意长度为 2 的子字符串都包含 2 个元音字母。

示例 3:
输入:s = "leetcode", k = 3
输出:2
解释:"lee"、"eet" 和 "ode" 都包含 2 个元音字母。

示例 4:
输入:s = "rhythms", k = 4
输出:0
解释:字符串 s 中不含任何元音字母。

示例 5:
输入:s = "tryhard", k = 4
输出:1

解题思路

输入:一个字符串 s 和一个整数 k

输出:在所有长度为 k 的子字符串中,最多包含多少个元音字母

本题属于固定长度滑动窗口类型问题。

我们可以维护一个大小为 k 的滑动窗口,记录当前窗口中元音字母的数量。

每次窗口右移时,根据进出的字符是否是元音来更新计数。

与此同时,使用一个变量记录遍历过程中遇到的最大元音数量。最终,遍历完成后返回最大值即可。

代码实现

python
class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        vowels = set('aeiou')  # 用一个集合保存所有元音字符,加速查找
        count = 0  # 统计当前窗口内的元音数量

        # 先统计前 k 个字符中有多少元音(初始化窗口)
        for i in range(0, k):
            if s[i] in vowels:
                count += 1
        
        ans = count  # 初始化最大元音数为当前窗口的元音数

        # 从第 k 个字符开始,滑动窗口向右移动
        for i in range(k, len(s)):
            # 如果窗口左侧滑出的是元音,则减去一个
            if s[i - k] in vowels:
                count -= 1
            # 如果窗口右侧新进入的是元音,则加上一个
            if s[i] in vowels:
                count += 1
            
            # 更新最大值
            ans = max(ans, count)
        
        return ans  # 返回最大元音数

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

链接

1456 国际版

1456 中文版