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)