题目:
给定一个仅包含数字的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
源自力扣官方题解