tags:
- 回溯法
- 深度优先算法
算法题解第五题:电话号码的字母组合
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
‘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’]
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
解法
首先想到这是一个排列组合的问题,想到使用DFS,来遍历整个树找出所有的可能。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。实现如下
def letterCombinations(self, digits: str) -> List[str]:
phone = {'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']}
res = [] #初始化结果列表
def dfs(temp,index): #定义回溯函数
if index == len(digits): #当前指数与字符串长度相等时,temp添加进结果函数结束
res.append(temp)
return
c = digits[index] # c = 当前指数对应字符
letters = phone[c] #letters =字符对应列表
for i in letters: #对列表中每个元素进行深度搜索
dfs(temp+i,index+1)
if not digits: #特例:输入字符串为空,
return res
else:
dfs("",0)
return res
自己一直对递归的用法没有理解透彻,这道也是思路能想明白但是对于实现的写法抓耳挠腮,以上实现也是借鉴题解中大佬所写。