Leetcode 17:電話號碼的字母組合(最詳細的解法!!!)
阿新 • • 發佈:2019-01-29
給定一個僅包含數字 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
如有問題,希望大家指出!!!