給你一個整數 n
,請你幫忙統計一下咱們能夠按下述規則造成多少個長度爲 n
的字符串:html
字符串中的每一個字符都應當是小寫元音字母('a'
, 'e'
, 'i'
, 'o'
, 'u'
)
每一個元音 'a'
後面都只能跟着 'e'
每一個元音 'e'
後面只能跟着 'a'
或者是 'i'
每一個元音 'i'
後面 不能 再跟着另外一個 ‘i’
每一個元音 'o'
後面只能跟着 'i'
或者是 'u'
每一個元音 'u'
後面只能跟着 'a'
因爲答案可能會很大,因此請你返回 模 10^9 + 7
以後的結果。java
輸入:n = 1 輸出:5 解釋:全部可能的字符串分別是:"a", "e", "i" , "o" 和 "u"。
輸入:n = 2 輸出:10 解釋:全部可能的字符串分別是:"ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou" 和 "ua"。
輸入:n = 5 輸出:68
1 <= n <= 2 * 10^4
從字符串最後一個字符逆推。以下圖所示,從右向左推算。數字表示以該字母開頭的字符串個數。web
固然,此題也能夠順推,這裏就不贅述。app
時間複雜度:
空間複雜度:
svg
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);// 強制轉換優先級較高,要加括號 } }