力扣每日一题2021-09-27解码方法II


639.解码方法II

题目描述

解码方法II


思路:动态规划

使用dp[0]表示以上个字符作为结尾的方案数,dp[1]表示以当前字符作为结尾的方案数。
于是有nxt_dp[0] = dp[1],而nxt_dp[1]由上个字符结尾方案数 * 当前字符单独解码方案数 + 上上个字符结尾方案数 * 上个字符与当前字符组合的方案数。
初始化的时候,由于上个字符为空,因此方案数为1;求解当前字符解码方案数即可。
定义一个字典枚举组合,如果方案不出现在字典枚举的组合中,则视为该方案不存在。
动态规划

class Solution:
    one = {'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1, '7': 1, '8': 1, '9': 1, '*': 9}
    two = {'10': 1, '11': 1, '12': 1, '13': 1, '14': 1, '15': 1, '16': 1, '17': 1, '18': 1,
            '19': 1, '20': 1, '21': 1, '22': 1, '23': 1, '24': 1, '25': 1, '26': 1, '*0': 2,
            '*1': 2, '*2': 2, '*3': 2, '*4': 2, '*5': 2, '*6': 2, '*7': 1, '*8': 1, '*9': 1,
            '1*': 9, '2*': 6, '**': 15}
    Mod = 10**9 + 7
    def numDecodings(self, s: str) -> int:
        dp = 1, self.one.get(s[:1], 0)
        for i in range(1, len(s)):
            dp = dp[1], (self.one.get(s[i], 0) * dp[1] + self.two.get(s[i-1: i+1], 0) * dp[0]) % self.Mod
        return dp[-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值