给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串:
字符串中的每个字符都应当是小写元音字母(‘a’, ‘e’, ‘i’, ‘o’, ‘u’)
每个元音 ‘a’ 后面都只能跟着 ‘e’
每个元音 ‘e’ 后面只能跟着 ‘a’ 或者是 ‘i’
每个元音 ‘i’ 后面 不能 再跟着另一个 ‘i’
每个元音 ‘o’ 后面只能跟着 ‘i’ 或者是 ‘u’
每个元音 ‘u’ 后面只能跟着 ‘a’
由于答案可能会很大,所以请你返回 模 10^9 + 7 之后的结果。
class Solution {
public:
int countVowelPermutation(int n) {
long long mod = 1e9 + 7;
//创建一个数组每一个元素为1
vector<long long> dp(5, 1);
vector<long long> ndp(5);
for (int i = 2; i <= n; ++i) {
/* a前面可以为e,u,i */
ndp[0] = (dp[1] + dp[2] + dp[4]) % mod;
/* e前面可以为a,i */
ndp[1] = (dp[0] + dp[2]) % mod;
/* i前面可以为e,o */
ndp[2] = (dp[1] + dp[3]) % mod;
/* o前面可以为i */
ndp[3] = dp[2];
/* u前面可以为i,o */
ndp[4] = (dp[2] + dp[3]) % mod;
//都是5个元素的数组,可以直接全部赋值
dp = ndp;
}
return accumulate(dp.begin(), dp.end(), 0LL) % mod;
}
};
方法:
n = 2,分别考虑a,e,i,o,u作为最后一个元素
n = 3,在n=2的基础上分别考虑a,e,i,o,u作为最后一个元素,这里需要 dp = ndp;把dp的元素全部替换为ndp的元素,借用n=2的所有情况