LeetCode刷题实战91:解码方法
共 2229字,需浏览 5分钟
·
2020-11-10 20:27
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 解码方法,我们先来看题面:
https://leetcode-cn.com/problems/decode-ways/
A message containing letters from A-Z is being encoded to numbers using the following mapping:
题意
示例 1:
输入:"12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入:"226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
示例 3:
输入:s = "0"
输出:0
示例 4:
输入:s = "1"
输出:1
示例 5:
输入:s = "2"
输出:1
解题
题解
class Solution:
def numDecodings(self, s: str) -> int:
n = len(s)
ret = 0
def dfs(i):
nonlocal ret
if i >= n:
ret += 1
return
# 当前位如果是0则说明无解,return
# 当前位为0说明上一位不是1或者2
if s[i] == '0':
return
# 递归单个的情况
dfs(i+1)
# 判断下一位能否构成组合
if i+1 < n and (s[i] == '1' or (s[i] == '2' and ord(s[i+1]) <= ord('6'))):
dfs(i+2)
dfs(0)
return ret
class Solution:
def numDecodings(self, s: str) -> int:
n = len(s)
# 为了简化判断,我们把s前面加上0,这样字符串下标从1开始
s = '0' + s
dp = [0 for _ in range(n+2)]
dp[0] = 1
for i in range(1, n+1):
# 如果当前位0,那么判断前一位是否是1或2
# 否则一定无解
if s[i] == '0':
if i > 1 and s[i-1] in ('1', '2'):
dp[i] = dp[i-2]
else:
return 0
continue
dp[i] = dp[i-1]
# 能和前一位构成字符,那么加上dp[i-2]的数量
if i > 1 and s[i-1] == '1' or s[i-1] == '2' and ord(s[i]) <= ord('6'):
dp[i] += dp[i-2]
return dp[n]
总结
上期推文: