一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:dp 以下标为状态,找到dp[i]与dp[i-1],dp[i-2]的关系 因为最多两位数
class Solution(object):
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
# dp解决 dp[i]=dp[i-1]+dp[i-2] 2种情况 要么单独要么加上前一个字母 注意:'0'的特殊处理
if not s:return 0
n=len(s)
dp=[0]*(n+1)
if s[0]=='0':return 0
if n==1:return 1
dp[0],dp[1]=1,1
for i in range(2,n+1):
# 判断是否为0 1.判断当前是否为0 2.判断上一个是否为0
if s[i-1]=='0':
if s[i-2]=='0':return 0
if int(s[i-2]+s[i-1])>26:return 0
else:dp[i]=dp[i-2]
else:
if s[i-2]=='0':dp[i]=dp[i-1]
elif int(s[i-2]+s[i-1])>26:
dp[i]=dp[i-1]
else:dp[i]=dp[i-2]+dp[i-1]
return dp[-1]