卷三 · 代码与实践1 分钟阅读

leetcode题解91:解码方法

描述

该题来自于力扣第91题

分析

假设s为a0a1...an−2an−1ana_0a_1...a_{n-2}a_{n-1}a_n,由于每个字母最多转为2位的字符串,那么从后面往前看,一种是ana_n单独解码,一种是an−1ana_{n-1}a_n一起解码,所以如果是ana_n单独解码,那么只需知道a0a1...an−1a_0a_1...a_{n-1}有多少中解码方式;如果是an−1ana_{n-1}a_n一起解码,那么只需知道a0a1...an−2a_0a_1...a_{n-2}有多少中解码方式;最后这两种解码方式相加即可。

所以这是个动态规划问题,记dp[i]表示从a0...aia_0...a_i的所有解码方式,aia_i可以单独解码的充分必要条件是ai≠0a_i \ne 0,0字符串不能转码;而ai−1aia_{i-1}a_i可以转码的充分必要条件是10≤ai−1ai≤2610 \le a_{i-1}a_{i} \le 26,满足两个条件则

text
dp[i] = dp[i-1] + dp[i-2]

只满足其中一个,另一个就不加到结果上即可,最后注意边界条件就好。

代码

python
class Solution:
    def numDecodings(self, s: str) -> int:
        dp = [0]*len(s)
        for i in range(len(s)):
            if s[i] != '0':
                dp[i] += dp[i-1] if i > 0 else 1
            if i > 0 and '10' <= s[i-1:i+1] <= '26':
                dp[i] += dp[i-2] if i > 1 else 1
        return dp[len(s)-1]

继续这个系列