public int countVowelPermutation(int n) {
// 动态规划算法
// 题目条件等价于
// a前面只能为e,i,u;
// e前面只能为a,i;
// i前面只能为e,o;
// o前面只能为i;
// u前面只能为o,i;
//递推方程
//0,1,2,3,4表示a,e,i,o,u
//dp[i][j]表示长度为i,以j结尾的字符串数量
//dp[i][0]=dp[i−1][1]+dp[i−1][2]+dp[i−1][4]
//dp[i][1]=dp[i−1][0]+dp[i−1][2]
//dp[i][2]=dp[i−1][1]+dp[i−1][3]
//dp[i][3]=dp[i−1][2]
//dp[i][4]=dp[i−1][2]+dp[i−1][3]
long mod = 1000000007;
long[] prev = new long[5];//上一行的数据
long[] post = new long[5];//下一行的数据
//第一行全为1
for (int i = 0; i < 5; ++i) {
prev[i] = 1;
}
//从第二行开始递推,到第n行
for (int i = 2; i <= n; ++i) {
/* a前面可以为e,u,i */
post[0] = (prev[1] + prev[2] + prev[4]) % mod;
/* e前面可以为a,i */
post[1] = (prev[0] + prev[2]) % mod;
/* i前面可以为e,o */
post[2] = (prev[1] + prev[3]) % mod;
/* o前面可以为i */
post[3] = prev[2];
/* u前面可以为i,o */
post[4] = (prev[2] + prev[3]) % mod;
System.arraycopy(post, 0, prev, 0, 5);
}
long ans = 0;
//将最后一行相加
for (int i = 0; i < 5; ++i) {
ans = (ans + prev[i]) % mod;
}
return (int)ans;
}
2022.1.17-----leetcode.1220
最新推荐文章于 2024-08-17 20:25:49 发布