百度文心大模型5.1 LeetCode 17. 电话号码的字母组合 Python3实现 📅 发布时间:2026/8/30 4:51:29 👁 浏览次数: LeetCode 17. 电话号码的字母组合 - Python3 实现题目描述给定一个仅包含数字2-9的字符串返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下与电话按键相同2 - abc 3 - def 4 - ghi 5 - jkl 6 - mno 7 - pqrs 8 - tuv 9 - wxyz解题思路方法思路适用场景回溯法逐个数字深搜拼接所有可能组合通用推荐队列/BFS逐层扩展组合理解直观迭代法用列表逐步累积结果代码简洁Python3 代码实现方法一回溯法推荐fromtypingimportListclassSolution:defletterCombinations(self,digits:str)-List[str]:# 边界情况空字符串ifnotdigits:return[]# 数字到字母的映射phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}result[]defbacktrack(index:int,path:str): index: 当前处理到第几个数字 path: 当前已拼接的字符串 # 递归终止所有数字都处理完ifindexlen(digits):result.append(path)return# 获取当前数字对应的字母digitdigits[index]lettersphone_map[digit]# 遍历每个字母继续递归forletterinletters:backtrack(index1,pathletter)backtrack(0,)returnresult方法二迭代法fromtypingimportListclassSolution:defletterCombinations(self,digits:str)-List[str]:ifnotdigits:return[]phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}result[]# 初始化为空字符串fordigitindigits:result[prevcurforprevinresultforcurinphone_map[digit]]returnresult方法三队列 BFSfromtypingimportListfromcollectionsimportdequeclassSolution:defletterCombinations(self,digits:str)-List[str]:ifnotdigits:return[]phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}queuedeque([])fordigitindigits:# 当前层的组合数量level_sizelen(queue)for_inrange(level_size):currentqueue.popleft()forletterinphone_map[digit]:queue.append(currentletter)returnlist(queue)测试代码if__name____main__:solSolution()# 测试用例 1digits123print(f输入: {digits1})print(f输出:{sol.letterCombinations(digits1)})# 期望: [ad,ae,af,bd,be,bf,cd,ce,cf]print()# 测试用例 2digits2print(f输入: {digits2})print(f输出:{sol.letterCombinations(digits2)})# 期望: []print()# 测试用例 3digits32print(f输入: {digits3})print(f输出:{sol.letterCombinations(digits3)})# 期望: [a,b,c]复杂度分析复杂度说明时间复杂度O(3^n × 4^m)n 为对应 3 个字母的数字个数m 为对应 4 个字母的数字个数空间复杂度O(3^n × 4^m)存储所有组合的空间不含递归栈回溯过程图解输入: 23 / | \ a b c ← 数字 2 的字母 /|\ /|\ /|\ d e f d e f d e f ← 数字 3 的字母 结果: ad,ae,af, bd,be,bf, cd,ce,cf递归树: level 0: │ level 1: a ──→ ad, ae, af b ──→ bd, be, bf c ──→ cd, ce, cf三种方法对比方法优点缺点回溯逻辑清晰易于扩展如加剪枝递归有栈开销迭代代码简洁无递归开销不够直观BFS层次分明易于理解队列额外空间LeetCode 17. 电话号码的字母组合 - Python3 实现题目描述给定一个仅包含数字2-9的字符串返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下与电话按键相同2 - abc 3 - def 4 - ghi 5 - jkl 6 - mno 7 - pqrs 8 - tuv 9 - wxyz解题思路方法思路适用场景回溯法逐个数字深搜拼接所有可能组合通用推荐队列/BFS逐层扩展组合理解直观迭代法用列表逐步累积结果代码简洁Python3 代码实现方法一回溯法推荐fromtypingimportListclassSolution:defletterCombinations(self,digits:str)-List[str]:# 边界情况空字符串ifnotdigits:return[]# 数字到字母的映射phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}result[]defbacktrack(index:int,path:str): index: 当前处理到第几个数字 path: 当前已拼接的字符串 # 递归终止所有数字都处理完ifindexlen(digits):result.append(path)return# 获取当前数字对应的字母digitdigits[index]lettersphone_map[digit]# 遍历每个字母继续递归forletterinletters:backtrack(index1,pathletter)backtrack(0,)returnresult方法二迭代法fromtypingimportListclassSolution:defletterCombinations(self,digits:str)-List[str]:ifnotdigits:return[]phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}result[]# 初始化为空字符串fordigitindigits:result[prevcurforprevinresultforcurinphone_map[digit]]returnresult方法三队列 BFSfromtypingimportListfromcollectionsimportdequeclassSolution:defletterCombinations(self,digits:str)-List[str]:ifnotdigits:return[]phone_map{2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz}queuedeque([])fordigitindigits:# 当前层的组合数量level_sizelen(queue)for_inrange(level_size):currentqueue.popleft()forletterinphone_map[digit]:queue.append(currentletter)returnlist(queue)测试代码if__name____main__:solSolution()# 测试用例 1digits123print(f输入: {digits1})print(f输出:{sol.letterCombinations(digits1)})# 期望: [ad,ae,af,bd,be,bf,cd,ce,cf]print()# 测试用例 2digits2print(f输入: {digits2})print(f输出:{sol.letterCombinations(digits2)})# 期望: []print()# 测试用例 3digits32print(f输入: {digits3})print(f输出:{sol.letterCombinations(digits3)})# 期望: [a,b,c]复杂度分析复杂度说明时间复杂度O(3^n × 4^m)n 为对应 3 个字母的数字个数m 为对应 4 个字母的数字个数空间复杂度O(3^n × 4^m)存储所有组合的空间不含递归栈回溯过程图解输入: 23 / | \ a b c ← 数字 2 的字母 /|\ /|\ /|\ d e f d e f d e f ← 数字 3 的字母 结果: ad,ae,af, bd,be,bf, cd,ce,cf递归树: level 0: │ level 1: a ──→ ad, ae, af b ──→ bd, be, bf c ──→ cd, ce, cf三种方法对比方法优点缺点回溯逻辑清晰易于扩展如加剪枝递归有栈开销迭代代码简洁无递归开销不够直观BFS层次分明易于理解队列额外空间