动态规划——解码方法

题目描述:

一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。

此题适宜使用动态规划的方法来做。

这里的状态转移方程比较麻烦,我一开始使用的是如下的状态转移方程:(太麻烦了,以至于我自己都不想解释。。。。)

for(int i=2;i<n;i++){
    int ival=stoi(s.substr(i-1,2));
    if(s[i]=='0') {
        if(ival==0||ival>26) return 0;
        if(ival<27&&ival>0) dp.push_back(dp[i-2]);
    }else{
        if(ival<27&&ival>9) dp.push_back(dp[i-1]+dp[i-2]);
        else if(ival<10) dp.push_back(dp[i-1]);
        else dp.push_back(dp[i-1]);
    }
}

下面,我们看一下pris_bupt所提供的一个状态转移方程:

image.png

简洁明了,对应的代码如下:

int numDecodings(string s) {
    if (s[0] == '0') return 0;
    int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
    for (int i = 1; i < s.size(); i++) {
        int tmp = curr;
        if (s[i] == '0')
            if (s[i - 1] == '1' || s[i - 1] == '2') curr = pre;
            else return 0;
        else if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6'))
            curr = curr + pre;
        pre = tmp;
    }
    return curr;
}

(什么时候我能写出这样的代码。。。)


题目来源:https://leetcode-cn.com/problems/decode-ways/

参考资料:https://leetcode-cn.com/problems/decode-ways/solution/c-wo-ren-wei-hen-jian-dan-zhi-guan-de-jie-fa-by-pr/
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值