AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← OD 20 天课程

华为 OD 训练营 · 题解精讲

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

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

题目描述

给你字符串 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

提示: 1 <= s.length <= 10^5 s 由小写英文字母组成 1 <= k <= s.length

参考代码

Python

题目:LC1456. 定长子串中元音的最大数目

难度:中等

作者:许老师-闭着眼睛学数理化

算法:固定滑窗

代码看不懂的地方,请直接在群上提问

class Solution: def maxVowels(self, s: str, k: int) -> int:

初始化包含所有5种元音字母的哈希集合

vowels = {'a', 'e', 'i', 'o', 'u'}

win_num = 0

初始化第一个窗口的情况

for ch in s[:k]: if ch in vowels: win_num += 1

ans = win_num

for right, ch in enumerate(s[k:], k):

A1

if ch in vowels: win_num += 1

A2

left_ch = s[right-k] if left_ch in vowels: win_num -= 1

A3

ans = max(ans, win_num)

return ans Java class Solution { public int maxVowels(String s, int k) { // Initialize a HashSet containing all 5 vowel letters Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));

int winNum = 0; // Initialize the situation for the first window for (int i = 0; i < k; i++) { if (vowels.contains(s.charAt(i))) { winNum++; } }

int ans = winNum;

for (int right = k, left = 0; right < s.length(); right++, left++) { // A1 if (vowels.contains(s.charAt(right))) { winNum++; } // A2 if (vowels.contains(s.charAt(left))) { winNum--; } // A3 ans = Math.max(ans, winNum); }

return ans; } }

C++ class Solution { public: int maxVowels(string s, int k) { // Initialize a set containing all 5 vowel letters unordered_set<char> vowels({'a', 'e', 'i', 'o', 'u'});

int winNum = 0; // Initialize the situation for the first window for (int i = 0; i < k; i++) { if (vowels.count(s[i]) > 0) { winNum++; } }

int ans = winNum;

for (int right = k, left = 0; right < s.size(); right++, left++) { // A1 if (vowels.count(s[right]) > 0) { winNum++; } // A2 if (vowels.count(s[left]) > 0) { winNum--; } // A3 ans = max(ans, winNum); }

return ans; } };