LeetCode-DP专题-统计字典序元音字符串的数目

题目描述:

给你一个整数 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求和就是答案。

你可能感兴趣的:(LeetCode-DP,动态规划)