2022.1.17-----leetcode.1220

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;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值