LeetCode 第17题--电话号码的组合(DFS)

1. 题目

2.题目分析与思路

3.代码

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所以要先判断一下是否为空。

猜你喜欢

转载自www.cnblogs.com/tjpeng/p/11625887.html