1. 题目
给你一个整数 n
,请返回长度为 n
、仅由元音 (a, e, i, o, u)
组成且按 字典序排列 的字符串数量。
字符串 s
按 字典序排列 需要满足:对于所有有效的 i
,s[i]
在字母表中的位置总是与 s[i+1]
相同或在 s[i+1]
之前。
示例 1:
1 2 3
| 输入:n = 1 输出:5 解释:仅由元音组成的 5 个字典序字符串为 ["a","e","i","o","u"]
|
示例 2:
1 2 3 4 5
| 输入:n = 2 输出:15 解释:仅由元音组成的 15 个字典序字符串为 ["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"] 注意,"ea" 不是符合题意的字符串,因为 'e' 在字母表中的位置比 'a' 靠后
|
示例 3:
提示:
2. 思路
2.1. 初步思路
令 0 -> a
, 1 -> e
, 2 -> i
, 3 -> o
, 4 -> u
定义数组f[i][j]
表示长度为i
,以j
结尾的字符串的数量
尝试模拟出n=3的情况:
1 2 3 4 5
| 推导过程: # n a e i o u # 1 1 1 1 1 1 # 2 5 4 3 2 1 # 3 15 10 6 3 1
|
可以看出,f[i][j] = f[i - 1][j] + f[i - 1][j - 1] + f[i - 1][j - 2] + f[i - 1][j - 3] + f[i - 1][j - 4]
可以获得初步代码:
1 2 3 4 5 6 7
| class Solution: def countVowelStrings(self, n: int) -> int: f = [[1] * 5 for _ in range(n)] for i in range(1, n): for j in range(1, 5): f[i][j] = f[i - 1][j] + f[i - 1][j - 1] + f[i - 1][j - 2] + f[i - 1][j - 3] + f[i - 1][j - 4] return sum(f[-1])
|
3. 代码
3.1. 动态规划
1 2 3 4 5 6 7
| class Solution: def countVowelStrings(self, n: int) -> int: dp = [1] * 5 for _ in range(n - 1): for i in range(1, 5): dp[i] += dp[i - 1] return sum(dp)
|