电话号码的字母组合 回溯与递归

题目描述:

给定一个仅包含数字 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函数也不是特别合适,所以还是用列表就可以了。

posted @   JunanP  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示