首先我们来看今日的题:
无论是要用什么方法解决这个问题,都要先做一些准备工作,比如说2对应三个字符[‘a’,‘b’,‘c’],这个我们第一想法就是使用字典表示。然后进行组合的话,需要有一个空的列表来添加所以我们需要一个空的列表。我们的三个方法如下:
- 暴力枚举
对于所有出现的可能我们一一列举,因为最多为四个字母,所以我们将0,1,2,3,4这5种情况都列举出来,使用条件语句完成本题,但是这种情况肯定效率很低。
list=[]
dict={
'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],
'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
if len(digits)==0:
return list
elif len(digits)==1:
return dict[digits]
elif len(digits)==2:
a=dict[digits[0]]
b=dict[digits[1]]
for i in range(len(a)):
for j in range(len(b)):
list.append(a[i]+b[j])
return list
elif len(digits)==3:
a = dict[digits[0]]
b = dict[digits[1]]
c = dict[digits[2]]
for i in range(len(a)):
for j in range(len(b)):
for z in range(len(c)):
list.append(a[i]+b[j]+c[z])
return list
else:
a = dict[digits[0]]
b = dict[digits[1]]
c = dict[digits[2]]
d = dict[digits[3]]
for i in range(len(a)):
for j in range(len(b)):
for z in range(len(c)):
for h in range(len(d)):
list.append(a[i] + b[j] + c[z]+ d[h])
return list
这种组合方法如果每多一个字符,效率就会越低。所以我们作为一种参考,不建议使用。
- 回溯的方法
假如字符串给定的是‘23’,那么我们先把2拿出来找出对应的【a,b,c】,并对【a,b,c】进行循环添加,并且对原有字符串进行把2删除操作得到(‘a’,3)(‘b’,3) (‘c’,3)这三种情况,然后再把3拿出来对应【d,e,f】,然后重复上面的操作。为了看起来方便,我们直接看图:
对应的代码是:
if len(digits)==0:
return []
dict={
'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],
'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
def huisu(a,b):
#a,b分别对应上图
if len(b)==0:
res.append(a)
else:
for i in dict[b[0]]:
#取出字符串中的第一个数字
huisu(a+i,b[1:])#这里的b[1:]就表示了每次把字符串中的数字都给删除。
res=[]
huisu('',digits)
return res
- 队列方法
和回溯的方法大同小异,思路基本一致。直接看代码:
if not digits:
return []
list=['abc','def','ghi','gkl','mno','pqrs','tuv','wxyz']
queue=[]
for digit in digits:
for _ in range(len(queue)):
tem=queue.pop(0)
for i in list[int(digit)-2]:
queue.append(tem+i)
return queue
代码解释:
我们使用列表对应按键,数字键2对应列表的0索引。
首先遍历digits,加入是‘23’,我们先把2拿出来,然后进入循环,目前queue长度为0,遍历2对应的‘abc’分别添加到queue中,第一次循环出来后就是字符串剩下‘3’,queue中添加了【a,b,c】,继续第二次循环,取出3对应的‘def’,分别进行循环对应。就完成了!
本解题方式没有回溯的方法好,但是也是一种较好的解题思路。希望和大佬们多多学习,共同进步。谢谢大家