64/300
- 解码方法 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('*')