91. 解码方法

Tg:DP

都在注释里

class Solution:
    def numDecodings(self, s: str) -> int:
        l=len(s)
        if l==0:
            return 0 
        if l==1:
            return int(s[0]!='0')
        #以下均为l>=2的情况
        if s[0]=='0':   #首位为0无法解码,GG
            return 0
        d=[0 for i in range(l)]
        d[0],d[1]=1,int(s[1]!='0')  #d[i]表示截止到i(包括i)的字符串s[:i+1]的解码方法数
        if s[:2]<='26':
            d[1]+=1
        #上面初始化前两位,因为下面的循环有用到i-2索引
        for i in range(2,l):
            x=s[i-1:i+1]
            if s[i]=='0':   #当前元素是0
                if x>='1' and x<='26':  #0能够与前一位组成有效数(即前一位为1或2)
                    d[i]=d[i-2]
                else:   #连续两位为0则GG
                    return 0
            else:   #当前元素不是0
                if x>='1' and x<='26':   #若当前位能与前一位组成有效数,则两种情况加一起
                    d[i]=d[i-1]+d[i-2]
                else:   #只能当前位自己做码,d[i]就和前一位一样
                    d[i]=d[i-1]
        # print(d)
        return d[-1]
# print(Solution().numDecodings('226'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值