力扣动态规划

  1. 解码方法
    一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

‘A’ -> “1”
‘B’ -> “2”

‘Z’ -> “26”
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:

“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例 1:

输入:s = “12”
输出:2
解释:它可以解码为 “AB”(1 2)或者 “L”(12)。
示例 2:

输入:s = “226”
输出:3
解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。
示例 3:

输入:s = “0”
输出:0
解释:没有字符映射到以 0 开头的数字。
含有 0 的有效映射是 ‘J’ -> “10” 和 ‘T’-> “20” 。
由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。

提示:

1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。

我说一种简单方式理解。
s是字符串。从0开始
f[i]是一个一维数组,代表截止到i位一共有f[i]种解法,这句话很重要,i表示位数,我们为了方便从第一位开始算,但是前面有f【0】;
所以下面的位数会错开一位。
比如,f【5】就代表不管s有多少位,s的前5位一共有f【5】种解法,先记住这一点,这是思路的突破口。
加入我们已经计量到了f【5】,即f【5】包括之前的都是有数字的,后面的f【6】=0;
然后我们考虑两种情况,就是s【5】是自己单独代表一个字母还是s【4】s【5】一起构成一个字母。
首先看第一种情况,如果s【5】单独代表一个字母,那么就简单了,这时f【6】=f【5】,这点应该好理解,就是说我后面再加一个字母,不影响我的种数。
第二种情况,就是s【4】和s【5】一起构成一个字母,那么之前的f【5】在此时就没有了意义,f【6】=f【4】,相当于f【4】后面加了一个字母。

如果说s【5】都满足这两种情况,那我们的f【6】两次赋值不就会出错吗?
我们的想法肯定是把两种情况加起来,
所以写法要改变
第一种:
f【6】=f【6】+f【5】;//这里的写法从目前来看有点多余,毕竟一开始f【6】是0,加一遍没有意义,但是我们现在只考虑了中间和后面正常运行的状态,还没有想好开始怎么写。
第二种:
f【6】=f【6】+f【4】;

中间态写完之后考虑起始态,f【1】一定是1,但是f【1】=f【1】+f【0】;我们把f【0】设为1就解决了问题。
f【2】可能是1或2,如果是2:
f【2】=f【2】+f【1】,
f【2】=f【2】+f【0】;
我们在这里可以看到,第一次加的那个f【2】没有用,所以之后改为
f【6】=f【5】;
f【6】=f【6】+f【4】;
下面是代码:

class Solution {
public:
    int numDecodings(string s) {
        int n=s.size();
        vector<int>f(n+1);
        f[0]=1;
        for(int i=1;i<=n;i++)
        {
            if(s[i-1]!='0')
            f[i]=f[i-1];
            if(i>1&&((s[i-2]-'0')*10+(s[i-1]-'0'))<=26&&s[i-2]!='0')
            f[i]=f[i]+f[i-2];
        }
        return f[n];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值