1. 程式人生 > >LeetCode 17 電話號碼的字母組合 python實現

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