LeetCode91. 解码方法(Python)

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

代码思路:

先找一找规律:
1->1
12->1,2、12
121->1,2,1、12,1、1,21
1212->1,2,1,(2)、12,1,(2)、1,21,(2)、
           12,(12)、,1,2,(12)
可以看出1212的解码可以看作是121的解码方法+12的解码方法

1->1
12->1,2 、12
123->1,2,3、12,3、1,23
1231->1,2,3,(1)、12,3,(1)、1,23,(1)
可以看出1231的解码方法是123的解码方法

还要考虑0的问题,0只能跟1或者2组合成10或20
假设当位置i,用res[i]存储nums[i-1:i+1]的解码方法数量
当(nums[i-1:i+1] >0) and nums[i-1:i+1] < 10):res[i] = res[i-1]
当(nums[i-1:i+1] = 10):res[i] = res[i-2]
当(nums[i-1:i+1]>10) and nums[i-1:i+1]<20) :res[i] = res[i-1] + res[i-2]
当(nums[i-1:i+1] = 20) :res[i] = res[i-2]
当(nums[i-1:i+1] > 20) and (nums[i-1:i+1] < =26):res[i] = res[i-1] + res[i-2]
当(nums[i-1:i+1] > 26) and (nums[i-1:i+1]%10 != 0):res[i] = res[i-1]
当(nums[i-1:i+1] > 26) and (nums[i-1:i+1]%10 == 0):return 0 

代码实现:

class Solution(object):
    def numDecode(self, snum):
        #只要首数字不为0,就会有1个解码方法
        res = [1]*len(snum)

        if snum[0] == '0':
            return 0
        #需要计算下前两个数字的解码方法
        temp = int(snum[0:2])
        if (temp > 0) and (temp< 10):
            #类似于09,01这样的
            return 0
        elif temp == 10:
            res[1] = 1
        elif (temp > 10) and (temp < 20):
            res[1] = 2
        elif temp == 20:
            res[1] = 1
        elif (temp > 20) and (temp <= 26):
            res[1] = 2
        elif (temp > 26) and (temp % 10 != 0):
            res[1] = 1
        elif (temp > 26) and (temp %10 == 0):
            return 0

        for i in range(2, len(snum)):
            temp = int(snum[i-1:i+1])
            if (temp > 0 and temp < 10) or (temp > 26 and temp % 10 != 0):
                res[i] = res[i-1]
            elif temp == 10 or temp == 20:
                res[i] = res[i-2]
            elif temp > 10 and temp <=26 and temp != 20:
                res[i] = res[i-1] + res[i-2]
            #连续两个0
            elif temp == 0:
                return  0       

        return res[-1]


 

猜你喜欢

转载自blog.csdn.net/Manson_Wang/article/details/82250643