原题
https://leetcode.com/problems/letter-combinations-of-a-phone-number/
解法1
递归, base case是当只有一位数字时, 返回对应的列表
Time: O(n)
Space: O(n)
class Solution:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
d = dict(zip('23456789', ['abc','def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']))
if len(digits) == 0:
return []
if len(digits) == 1:
return list(d[digits[0]])
prev = self.letterCombinations(digits[:-1])
last = list(d[digits[-1]])
ans = [s+c for s in prev for c in last]
return ans
解法2
DFS + backtracking. 回溯的条件是当i == len(digits), 说明我们已经遍历完整个字符串了, 此时将path加到结果中.
代码
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
def dfs(digits, i, path, res):
# backtracking condition
if i == len(digits):
res.append(path)
return
for char in d[digits[i]]:
dfs(digits, i+1, path+char, res)
if not digits: return []
d = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
res = []
dfs(digits, 0, '', res)
return res
解法3
BFS
代码
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
# base case
if not digits: return []
d = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
res = ['']
for digit in digits:
string = d[digit]
new_res = []
for char in string:
for path in res:
new_res.append(path+char)
res = new_res
return res