解码方法II
639.解码方法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]