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);// 強制轉換優先級較高,要加括號
    }
}
相關文章
相關標籤/搜索