python每日一练-电话号码的字母组合

首先我们来看今日的题:
在这里插入图片描述
无论是要用什么方法解决这个问题,都要先做一些准备工作,比如说2对应三个字符[‘a’,‘b’,‘c’],这个我们第一想法就是使用字典表示。然后进行组合的话,需要有一个空的列表来添加所以我们需要一个空的列表。我们的三个方法如下:

  1. 暴力枚举
    对于所有出现的可能我们一一列举,因为最多为四个字母,所以我们将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

这种组合方法如果每多一个字符,效率就会越低。所以我们作为一种参考,不建议使用。

  1. 回溯的方法
    假如字符串给定的是‘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
  1. 队列方法
    和回溯的方法大同小异,思路基本一致。直接看代码:
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’,分别进行循环对应。就完成了!
本解题方式没有回溯的方法好,但是也是一种较好的解题思路。希望和大佬们多多学习,共同进步。谢谢大家

猜你喜欢

转载自blog.csdn.net/m0_37623374/article/details/124688562