问题描述
数字加密,字母与数字之间的映射如下:[‘A' => 1, 'B' => 2, ... , 'Z' => 26],给定一串数字,求出所有可能结果的数量。
例如:输入:2312,输出为4,表示可解码成BCAB、BCL、WAB、WL四种。
分析
这道题最终可以转化成斐波那契数列进行计算。首先要确定的是,只有在数值小于26的时候,才可能出现多种解码,例如,当数字是12,可以解码成AB或者L,当数值大于26则只有唯一解码,例如,当数字是34,解码只有CD,因此可从这个角度出发来解决这个问题,即先对数字进行判断,如果大于2,则进行切分,如果等于二,考虑后面一个数是否大于6,如果大于6,则切分,不大于6则不变,例如:12213411可以切分成12213、4、11三部分,1227126可以切分为122、7、126三部分,之后对拆分之后的每个子集进行分析,分析的主要依据和之前类似,由于无论如何组合,能够进行解码的数字一定不能是三位数,所以对每一个子集再进行组合,这时候你会发现,在上面讨论的前提下,会形成一个解码个数随子集中元素个数变化的斐波那契数列(这个斐波那契数列没有第一项的1),求得每个子集解码个数之后,将这些数字相乘就得到了最终结果。
代码实现
# encoding:utf-8
a = input()
b = []
id_head = 0
for i in range(len(a)):
if int(a[i])>2:
b.append(a[id_head:i+1])
id_head = i+1
elif i == len(a)-1:
b.append(a[id_head:i + 1])
num = 1
fib = lambda n:1 if n<=2 else fib(n-1)+fib(n-2)
for i in range(len(b)):
num = num * fib(len(b[i])+1)
print(num)