1. 题目
给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。
字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。
示例 1:
| 12
 3
 
 | 输入:n = 1输出:5
 解释:仅由元音组成的 5 个字典序字符串为 ["a","e","i","o","u"]
 
 | 
示例 2:
| 12
 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的情况:
| 12
 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]
可以获得初步代码:
| 12
 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. 动态规划
| 12
 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)
 
 |