LeetCode 17 电话号码的字母组合 python实现

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

手机照片
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序

python实现,可以通过

解题思路:

     主要是递归,没啥说的看代码马上就可以明白  我自己的感觉是类似于 DFS(不完全类似吧)

这里重点吐槽一下:

感觉这一题目不合理,这一题目使用递归很容易想到.但是我在想算法采用递归来实现,对长度很长的数字组合 效果也是很差的,时间复杂度和空间复杂度非常高,速度是非常非常慢的!!! ,所以觉得不可行,就放弃了这个思路
结果想了一个上午,都想不出来好的方法,没办法只能写了一个递归试一下,官方竟然让我的代码通过了.感觉很不合理,
我用一个测试用例"22222222222222222"测试了一下啊,官方也是解不出来(因为具有非常高的时间复杂度和空间复杂度,超高)!
后来想了一下,估计官方出这题目的时候考虑到我们平时打字不会按下好多数字!!呵呵

class Solution:
    @staticmethod
    def letterCombinations(digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        num_str={
            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(num_str[int(digits)])
        res=[]
        res_suffix=Solution.letterCombinations(digits[1:])
        for x in num_str[int(digits[0])]:
            res.extend([x+y for y in res_suffix])
        return res


你可能感兴趣的:(常规算法题目,python,leetcode17,电话号码自由组合)