LeetCode(python)17.电话号码的字母组合

题目

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 1 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

思路

最直接的思路:对输入的数字串挨个处理,遍历选取当前数字的字母组合,选好一个就处理下一个

Step 1:定义数字 - 字母的映射关系

Step 2:处理边界逻辑:当输入的数字串为空时,不需要处理,直接返回空列表

Step 3:回溯的核心逻辑

(1)单层逻辑:对当前的数字,我要遍历选取其所映射的字母组合,选好一个就与当前的字符串拼接,并进行下一个数字的处理

(2)回溯函数需要传递的参数:当前处理到哪个数字了(index),当前拼接好的字符串(temp)

(3)终止条件:当拼接的字符串的长度 == 输入的数字串的长度,说明找到了一个组合,存进res答案中

代码

因为python的字符串是不可变类型,所以使用temp + char后,并没有改变temp的值,而是复制了一个新的字符串,所以backtrack()之后不需要使用temp - char还原,本身就没有变 

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        digit_map = {
            '2':"abc", '3':"def", '4':"ghi", '5':"jkl", '6':"mno", '7':"pqrs", '8':"tuv", '9':"wxyz"
        }   # 定义数字 - 字母映射
        n = len(digits)
        if n == 0:
            return []
        res = []
        def backtrack(index, temp):   # 回溯函数
            if len(temp) == n:        # 终止条件
                res.append(temp)
                return
            digit = digits[index]
            letters = digit_map[digit]
            for char in letters:      # 递归处理当前数字的字母组合
                backtrack(index + 1, temp + char)
        backtrack(0, "")
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值