python-leetcode 56.电话号码的字母组合
题目:
给定一个仅包含数字的2-9的字符串,返回所有它可能表示的字母组合,答案可以按任意顺序返回
给出数字到字母的映射如下(与电话按键相同),注意1不对应任何字母
方法一:深度优先搜索,回溯
递归函数
首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯过程中维护一个字符串,表示已有的字母排列,该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。
.
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if not digits: #空字符串,则返回空列表
return []
phonemap={ #映射数字到对应的字母
"2":"abc",
"3":"def",
"4":"ghi",
"5":"jkl",
"6":"mno",
"7":"pqrs",
"8":"tuv",
"9":'wxyz',
}
def backtrack(index): #回溯函数 ,处理当前的数字位置
if index==len(digits):
combinations.append("".join(combination))#将当前combination中的字母组合成字符串,加入 combinations 结果列表
else: #处理当前数字对应的所有可能字母
digit=digits[index] #取出当前 index 位置的数字
for letter in phonemap[digit]:#遍历当前数字 digit 对应的所有字母,2对应“a","b","c"
combination.append(letter) #将当前 letter 加入 combination,表示选择该字母
backtrack(index+1)#递归调用 ,处理下一个数字的字母组合
combination.pop()#回溯:撤销当前选择的字母,尝试下一个可能的字母
combination=[]#存储当前选择的字母
combinations=[]#用于存储所有可能的字母组合结果
backtrack(0)
return combinations #所有可能的字母组合
时间复杂度:O(3 **m ×4 **n ),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。
空间复杂度:O(m+n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n 是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n
源自力扣官方题解