给你字符串 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 个元音字母
看到字符串的题目第一反应就是使用动态规划,因此首先用经典的动态规划,使用dp数组去记录元音字母的数量。
迭代公式是:
d
p
[
i
]
=
d
p
[
i
−
1
]
+
f
l
a
g
(
s
[
i
]
)
−
f
l
a
g
(
s
[
i
−
k
]
)
dp[i] = dp[i-1] + flag(s[i])-flag(s[i-k])
dp[i]=dp[i−1]+flag(s[i])−flag(s[i−k])
其中
f
l
a
g
flag
flag表示某个位置上的字母是否是元音字母
由此得到的code如下所示:
class Solution:
def maxVowels(self, s: str, k: int) -> int:
if len(s)<1 or k <1 or len(s) < k:
return 0
dp = [0 for _ in range(len(s))]
latter = 'aeiou'
if s[0] in latter:
dp[0] = 1
for i in range(1,len(s)):
dp[i] = dp[i-1]
if s[i] in latter:
dp[i] += 1
if i >= k and s[i-k] in latter:
dp[i] = max(0,dp[i]-1)
return max(dp)
但是code的运行数据不是很好,我又想到其实不需要一整个数组来记录所有的结果,直接使用两个变量就好了,所以改进了一下code:
class Solution:
def maxVowels(self, s: str, k: int) -> int:
if len(s)<1 or k <1 or len(s) < k:
return 0
dp = 0
result = 0
latter = 'aeiou'
for i in range(len(s)):
if s[i] in latter:
dp += 1
if i >= k and s[i-k] in latter:
dp = max(0,dp-1)
result = max(result,dp)
return result
运行结果就好了很多:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-number-of-vowels-in-a-substring-of-given-length