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
本文探讨了如何通过算法生成电话号码对应的字母组合,提供了三种不同的实现方式:常规深度优先搜索(DFS)、简洁DFS和广度优先搜索(BFS)。通过对输入的数字字符串进行解析,映射到相应的字母,实现了所有可能的字母组合输出。
809

被折叠的 条评论
为什么被折叠?



