题目:有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。现在给一串数字,给出有多少种可能的译码结果。
实现逻辑:
1,使用队列的数据类型,每一轮更新一次可能出现的情况;
2,每次加入新的字符,就可能出现1-2种结果类型;
3,核心其实还是遍历了所有可能出现的结果;
说明:
现在网上搜索的代码都是只能显示有多少种可能的,几乎没有这些可能的具体结果
难点&遇到困难:
当初设计这个算法的时候,其实整体的逻辑流程都是没有问题的。但是,由于使用了浅拷贝所以导致了程序的结果总是有问题。
不过,还好后来检查中间流程的时候发现的算法错误的原因出现在拷贝的这个地方。
以前的错误形式(浅拷贝):d_mid和d1的指针指向同一个内存空间,共享相同的数据
d_mid = d1[j]
正确的形式(深拷贝):d_mid 重新获取系统内存存储和d1[ j ]相同的数据
d_mid = d1[j].copy()
实现代码:
1 d0 = input() 2 d1 = [[d0[0]]] # 初始化 3 4 # 对原始数据进行穷举 5 for i in d0[1:]: # 2 6 num = len(d1) 7 for j in range(num - 1, -1, -1): # d1 8 d_mid = d1[j].copy() 9 d_mid.append(i) 10 if len(d1[j][-1]) == 2 and int(i) != 0: # 前一个是二位数,并且当前数不为0 11 d1.append(d_mid) # 一位数 直接加入后面 12 del d1[j] 13 14 elif len(d1[j][-1]) == 1 and int(i) != 0: # 前面是一个一位数,并且当前数不为0 15 d1.append(d_mid) # 一位数直接加入后面 16 str_mid = d1[j][-1] + i # 当前二位数 17 if int(str_mid) <= 26: 18 d1.append(d1[j].copy()) # 转变成二位数 19 d1[-1][-1] = str_mid 20 del d1[j] 21 22 elif len(d1[j][-1]) == 1 and int(i) == 0: # 前面是一个一位数,并且当前数为0 23 str_mid = d1[j][-1] + i # 当前二位数 24 if int(str_mid) <= 26: 25 d1.append(d1[j].copy()) # 转变成二位数 26 d1[-1][-1] = str_mid 27 del d1[j] 28 29 # print(d1) 30 31 # 对d1中的所有可能性进行输出 32 for i in d1: 33 d2 = '' 34 for j in i: 35 d2 += chr(int(j) + 64) 36 print(d2) 37 38 print(len(d1))
输入例子1:
1345456
输出例子1:
MDEDEF
ACDEDEF
2
参考地址: