题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
思路:
使用字典来存放所有对应情况,然后用回溯法来枚举所有可能的情况。
以23为例,调用搜索函数,先读取第0位的数2,然后找字典中2对应的为abc,先遍历到a,将a放进结果路径中,再递归调用原函数,索引为1,读取3,开始遍历3对应的字母为def,先遍历到d,加进结果路径中,再递归调用函数,发现已经没有数了,将结果路径中的结果放进结果数组中,然后将d弹出,再遍历ef,同理将ae,af放进结果中,再弹出f,回溯到上一个循环里,遍历到的是a,将a弹出,开始遍历b,同样道理往结果中加bd,be,bf,最终返回结果。
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if len(digits) == 0:
return []
d = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
def dfs(digits,index,path,res,d):
if index == len(digits):
res.append(''.join(path))
return
digit = digits[index]
for c in d.get(digit):
path.append(c)
dfs(digits,index + 1,path,res,d)
path.pop()
res = []
dfs(digits,0,[],res,d)
return res
# 哈希表,回溯,通过穷举所有可能情况来找到所有解,走不通退回再走,回溯是用递归实现的
# dfs,深度优先搜索