版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/82953485
17. Letter Combinations of a Phone Number
题目描述
输入一只包含2-9数字的字符串, 返回所有可能的字母组合。数字-字母映射如图所示(像电话按键,注意数字1不匹配任何字母)
例子
Input: “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
解法
法1是常规DFS, 法2是简洁DFS,法3是BFS
边界:注意输入为空时,输出为[]
解法1
常规的DFS思想。首先建立一个数字-字母的映射mapping,截止条件是索引到的位置到达len(digits)
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits:
return []
self.mapping = {'2':'abc', '3':'def', '4':'ghi','5':'jkl', '6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
res = []
self.helper(digits, 0, '', res)
return res
def helper(self, digits, i, temp, res):
if i == len(digits):
res.append(temp)
return
for c in self.mapping[digits[i]]:
temp += c
self.helper(digits, i+1, temp, res)
temp = temp[:-1]
解法2
简洁DFS写法
class Solution(object):
def letterCombinations(self, digits):
if not digits:
return []
self.mapping = {'2':'abc', '3':'def', '4':'ghi','5':'jkl', '6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
return self.helper(digits)
def helper(self, digits):
if not digits:
return ['']
return [x + y for x in self.mapping[digits[0]] for y in self.helper(digits[1:])]
解法3
BFS,想象成在一颗多叉树上的层次遍历
class Solution(object):
def letterCombinations(self, digits):
if not digits:
return []
mapping = {'2':'abc', '3':'def', '4':'ghi','5':'jkl', '6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
queue = ['']
for num in digits:
for _ in range(len(queue)):
node = queue.pop(0)
for c in mapping[num]:
queue.append(node + c)
return queue