题目描述:
给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。
字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。
链接:https://leetcode-cn.com/problems/count-sorted-vowel-strings
示例
示例 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’ 靠后
解答:
class Solution {
public:
int countVowelStrings(int n) {
int dp[5];
int res=0;
for(int i=0;i<5;i++)
dp[i]=1;
for(int k=1;k<n;k++)
for(int i=4;i>=0;i--){
int sum=0;
for(int j=0;j<=i;j++)
sum+=dp[j];
dp[i]=sum;
}
for(int i=0;i<5;i++)
res+=dp[i];
return res;
}
};
dp表示为以五个字母结尾的字符串数量。
dp[0],1,2,3,4,5分别对应a,e,i,o,u
dp初始化为n=1时的情况,显然全为1。
现在考虑n=2。
当第二位为a时,显然前一位只能为a,否则违反了排序的规则,故末尾为a的字符串数就是前一阶段dp中末尾为a的字符串数量。
当第二位为e时,前一位只能是a、e,故末尾为e的字符串数是前一阶段dp中末尾为a和e的字符串数的和。
由此可以找到规律,当n=k时,对于第i个字母
dp[i]=dp[1]+dp[2]+…+dp[i-1](注意要倒序更新)
当更新n-1次后,对dp求和就是答案。