1. 程式人生 > >Leetcode 17:電話號碼的字母組合(最詳細的解法!!!)

Leetcode 17:電話號碼的字母組合(最詳細的解法!!!)

給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。

給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。




示例:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

說明:
儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。

解題思路

這是一個典型的通過回溯思想來解決的問題,其實就是暴力破解。假設我們先輸出

a d

接著,我們退回到按2的那一步,也就是回到了(這就是回溯法的精髓,我們要有一步回到上一步的操作,這實際上就是可以通過遞迴去實現的)

a

我們再進入e,這個時候,我們發現ae的長度等於23的長度,所以,我們將ae新增到結果的result中去。

a e

這裡我要說一下,我們常說的回溯法,其實是一種演算法思想,而這種演算法思想主要通過遞迴來實現,並不是說兩者等同。

class Solution:
    def __init__(self):
        self.letterMap = [
            ' ',
            '',
            'abc',
            'def',
            'ghi',
            'jkl'
, 'mno', 'pqrs', 'tuv', 'wxyz' ] def findCombination(self, digits, index, s, res): if index == len(digits): res.append(s) return char = digits[index] letters = self.letterMap[ord(char) - ord('0'
)] for letter in letters: self.findCombination(digits, index + 1, s + letter, res) def letterCombinations(self, digits): """ :type digits: str :rtype: List[str] """ result = list() if not digits: return result self.findCombination(digits, 0, "", result) return result

一個更pythonic的寫法

class Solution:
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if not digits:
            return []

        l_map = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', 
                 '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}

        chars = [l_map.get(d) for d in digits]
        return [''.join(x) for x in itertools.product(*chars)]

這裡我們使用到了itertools.product,實際上表示的是這種操作((x,y) for x in A for y in B)

同樣的,對於遞迴可以解決的問題,我們都應該思考是不是可以通過迭代解決。實際上,我們這裡在模擬itertools.product操作。

class Solution:
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        result = list()
        if not digits:
            return result

        l_map = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', 
                 '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}

        chars = [l_map.get(d) for d in digits]
        tmp = [[]]
        for pool in chars:
            tmp = [x+[y] for x in tmp for y in pool]

        for prod in tmp:
            result.append(''.join(prod))

        return result

如有問題,希望大家指出!!!