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]

 

 

 

posted @ 2020-06-18 12:40  nil_f  阅读(152)  评论(0编辑  收藏  举报