LeetCode 5216. 统计元音字母序列的数目(Java)DP

5216. 统计元音字母序列的数目

给你一个整数 n,请你帮忙统计一下咱们能够按下述规则造成多少个长度为 n 的字符串:html

字符串中的每一个字符都应当是小写元音字母('a', 'e', 'i', 'o', 'u'
每一个元音 'a' 后面都只能跟着 'e'
每一个元音 'e' 后面只能跟着 'a'或者是 'i'
每一个元音 'i' 后面 不能 再跟着另外一个 ‘i’
每一个元音 'o' 后面只能跟着 'i' 或者是 'u'
每一个元音 'u' 后面只能跟着 'a'
因为答案可能会很大,因此请你返回 模 10^9 + 7 以后的结果。java

示例 1:

输入:n = 1
输出:5
解释:全部可能的字符串分别是:"a", "e", "i" , "o""u"

示例 2:

输入:n = 2
输出:10
解释:全部可能的字符串分别是:"ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou""ua"

示例 3:

输入:n = 5
输出:68

提示:

  • 1 <= n <= 2 * 10^4

题解:

从字符串最后一个字符逆推。以下图所示,从右向左推算。数字表示以该字母开头的字符串个数。web

5216

固然,此题也能够顺推,这里就不赘述。app

时间复杂度: O ( n ) O(n)
空间复杂度: O ( n ) O(n) svg

Java:

class Solution {
    public int countVowelPermutation(int n) {
        long[] dp = new long[5];
        int mod = 1000000007;
        Arrays.fill(dp, 1);
        for (int i = 1; i < n; ++i) {
            long[] ndp = new long[5];
            // 逆推过程
            ndp[0] = dp[1];
            ndp[1] = (dp[0] + dp[2]) % mod;
            ndp[2] = (dp[0] + dp[1] + dp[3] + dp[4]) % mod;
            ndp[3] = (dp[2] + dp[4]) % mod;
            ndp[4] = dp[0];
            dp = ndp;
        }
        long ret = 0;
        for (long v : dp) {
            ret += v;
        }
        return (int) (ret % mod);// 强制转换优先级较高,要加括号
    }
}
相关文章
相关标签/搜索