leetcode 每日一题 91. 解码方法
动态规划
思路:
用dp[i]表示s从0到下标i的子串的解码总数。下面分情况讨论:
如果字符串为空或者首字符为‘0’,则直接返回0
如果首字符s[0]不为0,则dp[0] = 1
dp[0]=1的情况下:
- 若s[1] == '0',那么s[0]=='1'或者s[1]=='2'时,dp[1] = 1,否则dp[1] = 0 直接return 0 即可
- 若s[1] != '0',那么s[0] == '1' 时或者 s[0] =='2'并且s[1]在'1' - '6'之间时,dp[1] = 2,否则dp[1] = 1
在确定了dp[0]和dp[1]后,继续进行后续处理:
- 若s[i] == '0',那么s[i-1]=='1' or '2'时,dp[i] = dp[i-2] ,否则 return 0
- 若s[i] != '0' ,那么s[i-1] == '1'时或者s[i-1]=='2'并且'1'<=s[i]<='6'时,dp[i] = dp[i-1]+dp[i-2];否则dp[i] = dp[i-1]
代码:
class Solution: def numDecodings(self, s: str) -> int: if not s or s[0]=='0': return 0 dp = [1] for i in range(1,len(s)): if s[i] == '0': if s[i-1] == '1' or s[i-1] == '2': if i == 1: dp.append(1) else: dp.append(dp[i-2]) else: return 0 elif s[i-1] == '1' or (s[i-1]=='2' and s[i]>='1' and s[i]<='6'): if i == 1: dp.append(2) else: dp.append(dp[i-1]+dp[i-2]) else: dp.append(dp[-1]) return dp[-1]