【LeetCode 17】电话号码的字母组合

1. 题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述
示例:

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

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

2. 第一种方法

  • 首先建立一个字典,建立数字和其对应字母的映射关系;
  • 判空,若输入的是一个空字符串,直接输出一个空列表即可;
  • 初始化一个 res,用来保存组合后的字母,由于为了方便后序直接将字母连接到一起组成字母组合,需要将 res 初始化为[’’],否则无法进行连接;
  • 依次遍历取出数字字符串 digits 中的数字 c,执行res = [i+j for i in res for j in dict[c]],此处利用了迭代器:首先找到数字 c 在 dict 中对应的字母串,对其进行遍历(j 就表示每次遍历该字母串得到的字母);再将得到的结果依次加到 res 中的每个结果上(即 i + j),最后得到的 res 即为所得。
class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        dict = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
        if not digits:
            return []
        res = ['']
        for c in digits:
            res = [i+j for i in res for j in dict[c]]
        return res

3. 第二种方法

利用回溯法:

  • digits是数字字符串
  • track(digits)是digits所能代表的字母字符串
  • track(digits[0…n-1])
    = dict(digits[0]) + track(digits[1…n-1])
    = dict(digits[0]) + dict(digits[1]) + track(digits[2…n-1])
    =…

注意:
处理递归部分:
(1)首先获得 digits[index] 对应的字符是谁:c = digits[index]
(2)然后提取当前的数字对应的字母有哪些:temp = self.dict[c]
(3)接着就可遍历一遍字母串,每次就可以得到 digits[index] 代表的一个字母for i in range(0, len(temp)),下面要做的就是根据这一个字母继续向下搜索:回溯时self.backtrack(digits, index + 1, track + temp[i])传入的第三个参数track中保存了此时从digits[0…index-1]翻译得到的一个字母字符串,即当我们遍历到第 i 个字符时,把 temp 中的第 i 个字符放在 track 后面(也就是track + temp[i]),然后基于这个新的字符串继续向下寻找,处理 index + 1 位的可能性。

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        self.dict = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
        self.res = []
        if not digits:
            return []
        track = ''
        self.backtrack(digits, 0, track)
        return self.res

	# track中保存了此时从digits[0…index-1]翻译得到的一个字母字符串,
	# 寻找和digits[index]匹配的字母,获得digits[0…index]翻译得到的解
    def backtrack(self, digits, index, track):
        if index == len(digits):
            self.res.append(track)
            return
        c = digits[index]  # 获取数字字符
        temp = self.dict[c]  # 获取数字字符对应的字母串
        for i in range(0, len(temp)):  # 遍历得到的字母串,就可以得到digits[index]这个数字代表的一个字母
            # track.append(temp[i])
            self.backtrack(digits, index + 1, track + temp[i])  # 这步要做的就是使用这一个字母继续向下搜索
            # track.pop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值