电话号码的字母组合

题目描述:给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。下图的手机按键图,就表示了每个数字可以代表的字母。



与上一题“组合”(详见:点击打开链接)的思路是一致的,用的还是深搜 + 递归这样的模式。

首先,可以先构造一个数字与字母相对应的数组,比如,可以写成这个形式:

num_alp_table = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]

显然,num_alp_table中每个元素的索引是对应数字,而元素本身是这个数在手机键盘上对应的字母。

与之前“组合”的解决方法类似,我们此处还是写一个辅助函数helper(),helper()函数一共有5个参数:


digits:用户输入的数字字符串

num_alp_table:上面才说过

begin:当前需要处理的数字字符串的位置,比如,输入“23”,初始时,begin = 0,也就是处理“23”这个字符串的第0位“2”

path:记录字母组合的字符串

result:结果列表


helper()函数做的事情就是将数字字符串从begin开始到最后依次处理,将每一种可能的字母组合添加到结果列表中。深搜回溯的条件是len(path) == len(digits)

代码如下:

class Solution:
    # @param {string} digits A digital string
    # @return {string[]} all posible letter combinations
    def letterCombinations(self, digits):
        num_alp_table = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
        if len(digits) == 0:
            return []
        path, result = "", []
        begin = 0
        self.helper(digits, begin, path, result, num_alp_table)
        return result

    def helper(self, digits, begin, path, result, num_alp_table):
        # 深搜触底,回溯
        if len(path) == len(digits):
            result.append(path)
            return
        # 遍历某个数字代表的所有字母
        for i in num_alp_table[int(digits[begin])]:
            path += i
            # 从下一位开始,到最后的组合情况
            self.helper(digits, begin + 1, path, result, num_alp_table)
            path = path[:-1]
        # Write your code here



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值