Python 刷题日记: Letter Combination of a Phone Number

原题:
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
(中文翻译:给定一个数字字符串,返回数字代表的所有可能的字母组合。数字到字母的映射(如电话按钮一样)在下面给出。)

<code>这里写图片描述</code>

Input:Digit string '23'
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

解题思路:

直观理解:
将数字字符串的每一个数字对应的字母分别储存在一个list中,然后像树一样对应起来。例如‘2’-> [‘abc’],‘3’ -> [‘def’] ,那么
a,b,c可以分别组合[d,e,f],增加一个数字在原来组合好的基础上继续分别添加。

所以,我们最直接的想法是“递归算法”。首先我们不知道数字字符串长度是多少,那么如果直接使用for循环,无法得知嵌套多少个for,所以递归是最好的解决方案。


解题方案:

Solution1:

这里循环调用’leeterCombBT()’函数,利用下方的for循环,对数字字符串的每一个数字对应的字母,循环添加。

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if digits=='':
            return []
        DigitDict=[' ','1', "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
        res=['']
        def letterCombBT(digit,oldStrList):
            return [dstr+i for i in DigitDict[digit] for dstr in oldStrList]

        for d in digits:
            res=letterCombBT(int(d),res)
        return res

Tips: 这里的字母和数字的对应,可以利用list,下标就是对应的数字,也可以使用字典dict。

Solution2:

递归调用原函数,每次将数字字符串长度减到1(即为第一个数字),然后取出改数字对应的字母,并将其做成list,赋值到prev。然后运行最后一个递归原程序的addtional添加第二数字对应的字母。然后向后递归,直到取到最后一个数字对应的字母。

def letterCombinations2(digits):
    mapping = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl','6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}
    if len(digits) == 0:
        return []
    if len(digits) == 1:
        return list(mapping[digits[0]])
    prev = letterCombinations2(digits[:-1])
    addtional =letterCombinations2(digits[-1])
    return [s+c for s in prev for c in addtional]

这是一种典型的递归算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值