【刷题日记】leetcode91——Decode ways

2019 B站校招算法笔试编程题
大意是A-Z使用1-26编码,
那么输入一个数,求该编码可能表示多少种字符串

思路
这是一个非常类似于青蛙跳台阶,一次可以跳一级或者两级,N个台阶有多少种跳法的问题

但是这里限制了编码范围是1-26

对于一个输入字符串

  1. 边界1:
    s[0] 不能为0.,否则这个问题规模就不用在扩大了,直接返回0
    接下来创建问题规模的动态规划备忘录:

  2. 问题规模的递推:
    假设已经求出前i-1个问题的解。
    字符串加入第i个字符时:
    (1) 检查第i个字符是不是可以自己作为一个编码:

  • 如果该字符不是0,那么他自己可以表示一种编码方式,此时编码类别数和 i-1 规模相同

    (2) 检查第i个字符可不可以和前面组成一个编码:

  • 如果可以组:那么编码类别数 = i-1规模 的解 在加 i-2 规模的解

  • 如何检查: ‘0’ < s[i-2:i]<‘27’

  1. 备忘录的初始化问题
    问题规模为1的解为1或0.
    0已经在边界检查解决。
    为了方便从问题规模为1开始递推,
    将备忘录的0号为设置为1,
    备忘录的大小为 len(s)+1
    从下标为1开始表示问题规模。
    从下标为2开始检查是否可以与前一个字母做组合。
class Solution:
    def numDecodings(self, s)
        if s[0] == '0':
            return 0
        way = [0 for i in range(len(s)+1)]
        way[0] = 1
        for i in range(1,len(s)+1):
            if s[i-1]!='0':
                way[i] = way[i-1]
            if i>1 and '09' < s[i-2:i] <'27':
                way[i] += way[i-2]
        return way[-1]

你可能感兴趣的:(刷题日记)