LeetCode 456、定长子串中元音的最大数目
LeetCode 456、定长子串中元音的最大数目
给你字符串 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;
}
};