题目简介:
给你字符串 s
和整数 k
。
请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a
, e
, i
, o
, u
)。
示例 1:
1 | 输入:s = "abciiidef", k = 3 |
示例 2:
1 | 输入:s = "aeiou", k = 2 |
示例 3:
1 | 输入:s = "leetcode", k = 3 |
示例 4:
1 | 输入:s = "rhythms", k = 4 |
示例 5:
1 | 输入:s = "tryhard", k = 4 |
提示:
1 <= s.length <= 10^5
s
由小写英文字母组成1 <= k <= s.length
思路:
一开始想着用暴力法,结果就很自然的超时了。然后想了一下,觉得应该能用动态规划来做,首先dp[i]
的含义是以i
为结尾的k
个字符的字符串的元音数目。所以需要先初始化dp[k - 1]
。
从i == k
开始遍历时,存在两种大情况(s[i - k]
代表每次子字符串的首个字符):
- 若
s[i - k]
为元音字母:- 若
s[i]
也为元音字母,则dp[i] = dp[i - 1]
- 若
s[i]
不为元音字母,则dp[i] = dp[i - 1] - 1
- 若
- 若
s[i - k]
不为元音字母:- 若
s[i]
为元音字母,则dp[i] = dp[i - 1] + 1
- 若
s[i]
不为元音字母,则dp[i] = dp[i - 1]
- 若
然后每次存储最大值,最后返回即可。
代码如下:
1 | class Solution { |