第91题:解码方法
1.题目链接
[https://leetcode-cn.com/problems/decode-ways/]
2.题目内容
一条包含字母 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) 。
示例3:
输入: “100”
输出:0
示例4:
输入:“0”
输出: 0
本题需要注意“0”,考虑到零的位置,会多出很多条件。
3.解题思路
本题的思路(动态规划问题)主要考虑到各种条件限制:
(1)条件一:数字为空或为0,返回值为0;
(2)条件二:当后两个数是s[i-1]和s[i-2]都为“0”时,返回值为0;
(3)条件三:当s[i-2] + s[i-1] <= ‘26’ & s[i-2] == ‘0’ , m[i] = m[i-1];
当s[i-2] + s[i-1] <= ‘26’& s[i-1] == ‘0’ ,m[i] =m[i-2];
当s[i-2] + s[i-1] <= '26&其他情况下,m[i] = m[i-1]+m[i-2]
(4)条件四:当s[i-2] + s[i-1] > ‘26’ & s[i-1] == ‘0’,返回值为0;
当s[i-2] + s[i-1] > ‘26’& 其他情况,m[i] = m[i-1];
期初的错误解法:不考虑0,即数字由1~9构成;
(1)当 s[i-1] >= “2” & s[i] > “6”,dp[i] = dp[i-1]
其他条件下: dp[i] = dp[i-1] + dp[i - 2] 就会显得比较简单
4.代码实现
# 自己解法
#(甲) 不考虑0的错误解法:
class Solution:
def numDecodings(self, s: str) -> int:
s = list(s)
dp = [0] * int(len(s))
dp[0] = 1
if int(s[0]) >= 2 & int(s[1]) > 6:
dp[1] = 1
else:
dp[1] = 2
for i in range(2 , len(s)):
if int(s[i-1]) >= 2 & int(s[i]) > 6:
dp[i] = dp[i-1]
else:
dp[i] = dp[i-1] + dp[i - 2]
return dp[-1]
# 考虑0的正确解法
class Solution:
def numDecodings(self, s: str) -> int:
n = len(s)
if n==0:
return 0
if s[0] == '0':
return 0
dp = [-1 for i in range(n+1)]
dp[0] = 1
dp[1] =1
for i in range(2,n+1):
if s[i-2] == '0' and s[i-1] == '0':
return 0
if s[i-2] + s[i-1] <= '26':
if s[i-2] == '0':
dp[i] = dp[i-1]
elif s[i-1] == '0':
dp[i] = dp[i-2]
else:
dp[i] = dp[i-1] + dp[i-2]
elif s[i-1]=='0':
return 0
else:
dp[i] = dp[i-1]
return dp[-1]