Decode Ways:from LeetCode

题目大意:A-Z分别编码为1-26,给你一个数字串,问这个数字串有多少种解码方法?

如 12有两种1,2和12分别是AB 和 L

0开头的认为是非法的,因为无法解码,同样 1001也无法解码

这些特殊情况可以在代码中特殊处理,此题可以用简单的DP解决

比如串 s=121212;a[i]来表示第i个字节时能有多少解码方式

a[1]=1;a[2]=2;a[3]=a[1]+a[2];a[i]=a[i-2]+a[i-1]当且仅当s[i-1]s[i]组成的数字能解码且s[i]也能解码。其他情况同理分析,代码写的很直白

下面是AC代码

class Solution {
public:
    int numDecodings(string s) {
        int a[10000];
        int len=s.length(),num;
        if(s[0]>'0' && s[0]<='9')
        a[0]=a[1]=1;
        else
        return 0;
        for(int i=2;i<=len;i++)
        {
            num=(s[i-2]-'0')*10+(s[i-1]-'0');
            if(num==0)return 0;
            if(num>26 && s[i-1]=='0')return 0;
            a[i]=a[i-1];
            if(num<27 && num>10 && s[i-1]!='0')
                a[i]=a[i-1]+a[i-2];
            if(num==10)
                a[i]=a[i-2];
        };
        return a[len];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值