LeetCode 第17题--电话号码的组合(DFS)
1. 题目
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
2. 思路
这道题主要是考察了一个图的遍历,由两种方法,1.深度优先遍历2.广度优先遍历,一个用的是递归,或者栈,另一个用队列
3. 代码
先给出递归的深度优先遍历:(后来觉得这个是广度优先。。。。)
class Solution: def letterCombinations(self, digits: str) -> List[str]: def callback(list2,list1): if len(list1) == 1: #跳出条件 for i in list2: for k in list1[0]: res.append(i+k) else: callback([k + i for k in list2 for i in list1[0]],list1[1:]) res = [] str1 = 'abc def ghi jkl mno pqrs tuv wxyz'.split(' ') list3 = [list(str1[int(i)-2]) for i in digits] if len(list3) == 0: #主要是排除空的情况,否则在第6行会出现out of index return [] callback([''],list3) return res
从代码中可以看出,递归主要分为两个部分,第一个部分是最终的条件部分,第二个部分是自身调用函数的过程,递归的目的就是将一个多重问题转变为两个两个操作的过程。就像callback中的 跳出条件一样,否则的话,就将list1中的第一个列表和list2 进行合并后再执行callback函数,看看list1 是不是长度为1的了。
这里有一个坑,就是如果输入的是空的话,就会出现outofindex所以要先判断一下是否为空。