题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解题思路
对于这种很明显需要循环遍历,同时for循环又很难实现的组合问题,可以说有8,9成的概率不是深度优先搜索、广度有限搜索就是回溯法,总之是跟递归脱不了关系。
首先,可以确定这是一个组合问题。
其次,要给出所有可能的组合。
(1)建立数字到字母的映射字典
num2str = {'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
(2)深度优先搜索策略
![](https://i-blog.csdnimg.cn/blog_migrate/094ecfb665af936a44e3bc1ab55a8dee.png)
以数字组合'23'为例
'2' a,b,c
(a,'3')
'3' d,e,f
(ad,[])
len(digits) == 0: output.append(ad) break;
(ae,[])
len(digits) == 0: output.append(ae) break;
(af,[])
len(digits) == 0: output.append(af) break;
'3' 的 letters 已经全部遍历完成。break;
(b,'3')
'3' d,e,f
(bd,[])
len(digits) == 0: output.append(bd) break;
(be,[])
len(digits) == 0: output.append(be) break;
(bf,[])
len(digits) == 0: output.append(bf) break;
'3' 的 letters 已经全部遍历完成。break;
(c,'3')
'3' d,e,f
(cd,[])
len(digits) == 0: output.append(cd) break;
(ce,[])
len(digits) == 0: output.append(ce) break;
(cf,[])
len(digits) == 0: output.append(cf) break;
'3' 的 letters 已经全部遍历完成。break;
回溯完成,输出所有合理的组合。
完整代码
## 输入数字组合:'234'或者'23'等。
## 输出数字对应的字母组合
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
num2str = {'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
def backtrack(combination,digits):
if len(digits) == 0:
output.append(combination)
else:
for letter in num2str[digits[0]]:
backtrack(combination+letter,digits[1:])
output = []
if digits:
backtrack('',digits)
return output
解决算法问题,首先要能总结出其过程实现,剩下的就是选择合适的结构进行实现。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number