一条包含字母 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]