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()