【回溯】leetcode每日一题—17.电话号码的字母组合

461 篇文章 1 订阅

题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述
思路:
回溯,过程示例
a
ad
a
ae
a
af
a

b
bd
b
be
b
bf
b

c
cd
c
ce
c
cf
c
解答:
方法一:回溯
树的每层使用的是 不同的集合时,无需startidx

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        dic={"2":"abc",
        "3":"def",
        "4":"ghi",
        "5":"jkl",
        "6":"mno",
        "7":"pqrs",
        "8":"tuv",
        "9":"wxyz"}
        
        res=[]
        path=[]
        def tracebacking(digits,idx):
            nonlocal res,path
            if len(path)==len(digits):
                res.append(''.join(path))
                return  
            elements=digits[idx]
            for c in dic[elements]:
                path.append(c)
                tracebacking(digits,idx+1)
                path.pop()
                
        if not digits:
            return res
        tracebacking(digits,0)
        return res

原始解答:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        result = []
        if digits == "":
            return result
        #数字对应的英文字母列表
        word_list = ["0", "0", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]

        #输入的digits的长度,作为回溯函数返回的判断条件
        dlen = len(digits)
         
        #回溯函数(path当前路径,默认为"")
        def back_track(digits, index, path):
            #如果目前path的长度和digits的长度相等,说明已经遍历完一趟,返回结果列表
            if index == dlen:
                result.append(path)
                return
            #遍历当前索引的数字对应的英文列表
            for word in word_list[int(digits[index])]:
                #路径加上当前字母
                path = path + word
                #递归下一个数字对应的英文列表
                #print(path)
                back_track(digits, index + 1, path)
                #撤销当前字母
                path = path[:-1]
                #print(path)
        back_track(digits, 0, "")

        return result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值