Dynamic Programming学习笔记 (33) - 统计字典序元音字符串的数目 (力扣# 1641)

221 阅读1分钟

本题出自力扣题库第1641题。题面大意如下:

给定一个整数n,返回长度为n,仅由元音 (a, e, i, o, u) 组成且按字典序排列的字符串数量。

示例:

输入:n = 2
输出:15
解释:仅由元音组成的 15 个字典序字符串为
["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"]

题解:

本题是个简单的排列组合类应用,遵循DP思路,我们可以定义5个变量countA,countE,countI,countO,countU,分别表示当长度为k时,以a,e,i,o,u为结尾的所有符合题面要求的字符串的数量。那么当字符串长度增加1后,以a为结尾的字符串数量没有变化,因为a只能跟在a后面,而以e为结尾的字符串数量则增加为countA和countE之和,因为e可以跟在a和e的后面,由此类推,我们可以得到如下表达式:

    countA' = countA
    countE' = countA + countE
    countI' =  countA + countE + countI = countE' + countI
    countO' = countA + countE + countI + countO = countI' + countO
    countU' = countA + countE + countI + countO + countU = countO' + countU

从以上表达式出发,我们可以将countA,countE,countI,countO和countU初始化为1,对应字符串长度为1的情况,然后使用一个简单的循环以表示字符串长度的增加并依次更新这些变量,循环完成后, countA,countE,countI,countO和countU之和就是问题的最终答案。

Java代码如下:

class Solution {
    public int countVowelStrings(int n) {
        int countA = 1, countE = 1, countI = 1, countO = 1, countU = 1;
        for (int i = 2; i <= n; i ++) {
            countE = countA + countE;
            countI = countE + countI;
            countO = countI + countO;
            countU = countO + countU;
        }
        return countA + countE + countI + countO + countU;
    }
}