leetcode 17 电话号码的字母组合

题目描述

给定一个仅包含数字 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)深度优先搜索策略

图一

 

以数字组合'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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nobrody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值