91. 解码方法

在这里插入图片描述
在这里插入图片描述
三步走,定义状态,状态转移方程,basecase
1.定义状态:dp[i]表示的是以s[i]为结尾可以有几种解码方法
2.状态转移:如果s[i]不为0,那么dp[i]继承dp[i-1],也就是dp[i]=dp[i-1]1。如果s.substr(i-1,2)的数字>=10且<=26,那么证明又多了一种表示方法,就让dp[i] += dp[i-2]1。加入126dp[0]=1,dp[1]=2,dp[3]就等于dp[2]的两种方式s.substr(3)这种方式+dp[1]的一种方式s.substr(2,3)这种方式

class Solution {
public:
    int numDecodings(string s) {
        //如果有前导0直接false
        if(s[0] == '0') return 0;
        vector<int> dp(s.length());
        
        //定义状态:dp[i]表示的是以s[i]为结尾可以有几种解码方法
        //状态转移:如果s[i]不为0,那么dp[i]继承dp[i-1],也就是dp[i]=dp[i-1]*1
        //如果s.substr(i-1,2)的数字>=10且<=26,那么证明又多了一种表示方法,就让dp[i] += dp[i-2]
        //初始化:dp[0] = 1
        dp[0] = 1;
        for(int i = 1; i < s.length(); ++i){
            if(s[i] != '0'){
                dp[i] = dp[i-1];
            }
            int num = (s[i-1]-'0')*10 + (s[i]-'0');
            if(num >= 10 && num <= 26){
                if(i == 1) dp[i] += 1;
                else dp[i] += dp[i-2];
            }
        }

        return dp[s.length()-1];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值