华为 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; } };