【c++】【leetcode91】解码方法(动态规划)

解码方法
在这里插入图片描述

题解

dp[i]表示到第i-1个字母时解码的方法有多少种

动态转移方程

dp[i] = dp[i-1]+dp[i-2]

特殊情况

  • s[i]无法和s[i-1]组合:s[i-1]=0 or s[i-1] > 2 or (s[i-1] = 2 && s[i] > 6 ,此时dp[i] = dp[i-1]
  • s[i]只能和s[i-1]组合,s[i]=0,此时dp[i] = dp[i-2]
class Solution {
public:
    int numDecodings(string s) {
        int n = s.size();
        if(s[0] == '0')return 0;
        if(n == 1)return 1;
        vector<int> dp(n + 1);
        dp[0] = 1;
        dp[1] = 1;

        for(int i = 1;i < n;++i){
            if(s[i] == '0' && (s[i-1] > '2' || s[i-1] == '0'))return 0;
            else if(s[i] == '0')dp[i + 1] = dp[i - 1];
            else if(s[i-1] > '2' || s[i-1] == '0' || (s[i-1] >= '2' && s[i] > '6'))
            		dp[i+1] = dp[i];
            else dp[i + 1] = dp[i] + dp[i-1];
        }
        return dp[n];
    }
};
//dp[i]=第i位有多少种
//dp[i] = dp[i-1] + dp[i-2]

dp[i] ,dp[i-1],dp[i-2]用c,b,a来表示,节约空间。

class Solution {
public:
    int numDecodings(string s) {
        int n = s.size();
        if(s[0] == '0')return 0;
        if(n == 1)return 1;
        int a = 1,b = 1,c;
        for(int i = 1;i < n;++i){
            if(s[i] == '0' && (s[i-1] > '2' || s[i-1] == '0'))return 0;
            else if(s[i] == '0')c = a;
            else if(s[i-1] > '2' || s[i-1] == '0' || (s[i-1] >= '2' && s[i] > '6'))c = b;
            else c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值