电话号码的字母组合 回溯与递归
题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
思路分析
这是典型的回溯问题,回溯的思路就是:第一个递归函数,在递归里做选择,进入递归,再出来撤销当前选择做另一个选择,再进入递归……
一般递归函数的常用写法就是:
def 递归函数(现有状态,选择列表):
处理base case以及结果情况
return
遍历选择列表:
添加选择
递归函数(新状态,选择列表)
删除刚才的选择(即回溯)
代码:
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits:#先处理特殊情况,很多题都会卡这种特殊案例
return []
dic = { #根据题意定义一个映射表,后续用来获取选择列表
2:'abc',
3:'def',
4:'ghi',
5:'jkl',
6:'mno',
7:'pqrs',
8:'tuv',
9:'wxyz'}
res = []#存放结果的列表
lenth = [len(digits)]#这里用一个列表存放总长度,起一个全局变量的作用
def di(has,choose):#回溯函数,参数has表示现有状态,choose表示选择列表
if len(has)==lenth[0]:#如果现有状态的长度等于数字长度
res.append(has)#就加入最终结果,且程序结束返回。
return
choss = int(choose[0])#选取选择列表中的第一个数字
for zimu in dic[choss]:#遍历这个数字的映射
has=has+zimu#更改新的状态
di(has,choose[1:])#递归(新状态,剩余选择)
has = has[:-1]#撤销选择
di('',digits)#调用递归函数,初始化现有为空,选择为给定的数字
return res
这个题是回溯方法的典型例子,可以通过这个题加深对回溯和递归的理解。
值得一提的是这里我用到了一个LeetCode中写python代码的小技巧,就是全局变量可以用一个列表存放。如果不用列表存放“外部变量”的话,在自己定义的函数内部是无法调用外部变量的,而global函数也不是特别合适,所以还是用列表就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了