1641. 统计字典序元音字符串的数目 几种不同的状态

数学解法

高中学过的隔板方法

dp思路

  1. d p [ j ] [ i ] , j = 0 , 1 , 2 , 3 , 4 dp[j][i],j=0,1,2,3,4 dp[j][i],j=0,1,2,3,4末尾的字幕为 j j j,长度为 i i i的时候我们取得的最小值字符串的数量。
  2. 状态转移方程 d p [ 0 ] [ i ] = d p [ i − 1 ] , d p [ 1 ] [ i ] = d p [ 0 ] [ i − 1 ] + d p [ 1 ] [ i − 1 ] , . . . , d p [ 4 ] [ i ] = d p [ 0 ] [ i − 1 ] + d p [ 1 ] [ i − 1 ] + d p [ 2 ] [ i − 1 ] + d p [ 3 ] [ i − 1 ] dp[0][i]=dp[i-1],dp[1][i]=dp[0][i-1]+dp[1][i-1],...,dp[4][i]=dp[0][i-1]+dp[1][i-1]+dp[2][i-1]+dp[3][i-1] dp[0][i]=dp[i1],dp[1][i]=dp[0][i1]+dp[1][i1],...,dp[4][i]=dp[0][i1]+dp[1][i1]+dp[2][i1]+dp[3][i1]
  3. 可以优化空间复杂度到 O ( 1 ) O(1) O(1)
  4. 时间复杂度 O ( n ) O(n) O(n)

未优化空间,空间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    vector<vector<int>>dp;
    int countVowelStrings(int n) {
        if(n<=0){
            return 0;
        }
        dp.resize(5);
        for(int i=0;i<dp.size();i++){
            dp[i].resize(n+1);
        }

        dp[0][1]=dp[1][1]=dp[2][1]=dp[3][1]=dp[4][1]=1;
        int tmp=0;
        for(int i=2;i<=n;i++){
            tmp=0;
            for(int j=0;j<5;j++){
                tmp+=dp[j][i-1];
                dp[j][i]=tmp;
            }
        }
        int res=0;
        for(int i=0;i<5;i++){
            res+=dp[i][n];
        }
       cout<<res<<endl;
       return res;
    }
};

已经优化空间,空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    vector<vector<int>>dp;
    int countVowelStrings(int n) {
        if(n<=0){
            return 0;
        }
        dp.resize(5);
        for(int i=0;i<dp.size();i++){
            // dp[i].resize(n+1);
            dp[i].resize(1);
        }

        dp[0][0]=dp[1][0]=dp[2][0]=dp[3][0]=dp[4][0]=1;
        int tmp=0;
        for(int i=2;i<=n;i++){
            tmp=0;
            for(int j=0;j<5;j++){
                tmp+=dp[j][0];
                dp[j][0]=tmp;
            }
        }
        int res=0;
        for(int i=0;i<5;i++){
            res+=dp[i][0];
        }
       cout<<res<<endl;
       return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值