一、问题描述
给你一个整数 n
,请返回长度为 n
、仅由元音 (a, e, i, o, u)
组成且按 字典序排列的字符串数量。
字符串 s
按字典序排列需要满足:对于所有有效的i
,s[i]
在字母表中的位置总是与 s[i+1]
相同或在 s[i+1]
之前。
示例 1:
输入:n = 1
输出:5
解释:仅由元音组成的 5 个字典序字符串为 ["a","e","i","o","u"]
示例 2:
输入:n = 2
输出:15
解释:仅由元音组成的 15 个字典序字符串为
["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"]
注意,"ea" 不是符合题意的字符串,因为 'e' 在字母表中的位置比 'a' 靠后
示例 3:
输入:n = 33
输出:66045
提示:
1 <= n <= 50
二、解题思路
2.1 简单分析
将a, e, i, o, u
为首各分为一种来讨论。
n = 1
时:
a | e | i | o | u |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1 |
a | e | i | o | u |
一共result_1 = 1 + 1 + 1 + 1 + 1 = 5
种
n = 2
时:
a | e | i | o | u |
---|---|---|---|---|
5 | 4 | 3 | 2 | 1 |
aa,ae,ai,ao,au | ee,ei,eo,eu | ii,io,iu | oo,ou | uu |
一共result_2 = 5 + 4 + 3 + 2 + 1 = 15
种
通过观察不难发现,以n = 2
为例,以a
为首时,接下来的一个元素可以为任意的n = 1
的元素,也就是说以a
为首字符串的种类应该等于n = 1
时的a, e, i, o, u
种类之和,也就是result_1
。同理,以e
为首的字符串的种类应该为n = 1
时的e, i, o, u
种类之和,或者表述成result_1 - a
,即为4
,后面的元素同理分析。
2.2 综合分析
2.2.1 方法一
通过上述简单观察,可以发现,当n = n
时,有以下规律:
result_n_a = result_n-1
result_n_e = result_n-1 - result_n-1_a = result_n_a - result_n-1_a
result_n_i = result_n-1 - result_n-1_a - result_n-1_e = result_n_e - result_n-1_e
result_n_o = ... = result_n_i - result_n-1_i
result_n_u = ... = result_n_o - result_n-1_o
或者写成:
result_n_a = result_n-1_a + result_n-1_e + result_n-1_i + result_n-1_o + result_n-1_u
result_n_e = result_n-1_e + result_n-1_i + result_n-1_o + result_n-1_u
result_n_i = result_n-1_i + result_n-1_o + result_n-1_u
result_n_o = result_n-1_o + result_n-1_u
result_n_u = result_n-1_u
因此可以有以下方法:
class Solution {
public int countVowelStrings(int n) {
int[] a = new int[51];
int[] e = new int[51];
<