给你一个整数 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);// 强制转换优先级较高,要加括号 } }