【lc刷题】639 解码方法 2(DP)_Day18(64/300)

64/300

  1. 解码方法 2
    一条包含字母 A-Z 的消息通过以下的方式进行了编码:
     
    ‘A’ -> 1
    ‘B’ -> 2

    ‘Z’ -> 26
    除了上述的条件以外,现在加密字符串可以包含字符 ‘‘了,字符’‘可以被当做1到9当中的任意一个数字。
     
    给定一条包含数字和字符’'的加密信息,请确定解码方法的总数。
     
    同时,由于结果值可能会相当的大,所以你应当对109 + 7取模。(翻译者标注:此处取模主要是为了防止溢出)
     
    示例 1 :
     
    输入: "
    "
    输出: 9
    解释: 加密的信息可以被解密为: “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”.
     
    示例 2 :
     
    输入: “1*”
    输出: 9 + 9 = 18(翻译者标注:这里1可以分解为1, 或者当做1来处理,所以结果是9+9=18)
    说明 :
     
    输入的字符串长度范围是 [1, 105]。
    输入的字符串只会包含字符 '
    ’ 和 数字’0’ - ‘9’。

91 解码方法(DP)的升级版

这次用的方法是dp = factor(s[i-1:i+1]) * dp[0] + factor(s[i]) * dp[1]

以下均是大佬的代码:

首先建好字典,通过:

one = {str(i): 1 for i in range(1, 10)}
one.update({'*': 9, '0': 0})

two = {str(i): 1 for i in range(10, 27)}
two.update({'*' + str(i): 2 if i <= 6 else 1 for i in range(10)})
two.update({'1*': 9, '2*': 6, '**': 15})

得到:

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}

def numDecodings(s):
    """
    :type s: str
    :rtype: int
    """        
    mod = 10**9 + 7
    
    dp = 1, one.get(s[:1], 0) #(1,1or9)
    
    for i in range(1, len(s)):
   
        dp = dp[1], (one.get(s[i], 0) * dp[1] + two.get(s[i-1: i+1], 0) * dp[0]) % mod
        
    return dp[-1]

numDecodings('*')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值