【算法题】17. 电话号码的字母组合-力扣(LeetCode)
1.题目
下方是力扣官方题目的地址
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
2.题解
该题是比较典型的回溯题
思路
- 题目中提供的
digits
是号码,我们要想得到字母的组合,必须要找到数字所对应的字母,由于数字给定1-9,很容易想到用哈希表来对应,而python中类似于哈希表的数据结构是字典,所以我们就用字典来对应字母
di={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
-
选择号码所对应的字母是一层一层来的,我们很容易想到树结构,而树结构就可以想到深度优先搜索。
比如当
digits=“23”
时,这颗树一共有两层,第一层选2
所对应的abc
,第二层选3
所对应的def
而且没有其他的要求,因此不用剪枝
所以就以
digits=“23”
为例来画一个树
依据这个树结构,我们就很容易写出dfs的函数了
Python代码
class Solution(object):
def letterCombinations(self, digits):
global s
"""
:type digits: str
:rtype: List[str]
"""
global rev
di={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'} # 利用哈希表来将数字与字母对应起来
ans,rev=[],'' # ans为输出,rev为ans中的元素,即一个已经选好的组合
def f(d):
global rev
if d==len(digits):return
for i in di.get(digits[d]): # "di.get(digits[d])" 表示这一层中被选择的字母
rev+=i
if d==len(digits)-1:ans.append(rev) # 递归到树的最底层时表明已经选好,添加到ans中去
f(d+1)
rev=rev[:-1] # 回溯
f(0)
return ans
3.结语
本人资历尚浅,发博客主要是记录与学习,欢迎大佬们批评指教!大家也可以在评论区多多交流,相互学习,共同成长。