问题:返回所有组合-》回溯/队列/递归
递归:
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits: return [] # 输入为空的特殊情况
digitDict = { # 电话号码的数字对应字母字典
'2':['a','b','c'],
'3':['d','e','f'],
'4':['g','h','i'],
'5':['j','k','l'],
'6':['m','n','o'],
'7':['p','q','r','s'],
'8':['t','u','v'],
'9':['w','x','y','z']
}
# 递归函数
def backtrack(former, nextdigits): # former记录之前的结果-字母串,nextdigits记录剩下需要添加的数字字母
if len(nextdigits) == 0: # 递归出口:后面没有数字了
res.append(former) # 添加到结果中
else:
for letter in digitDict[nextdigits[0]]: # 只对第一个数字进行字母遍历
backtrack(former+letter, nextdigits[1:]) # 字母拼接,并继续递归剩下的数字
res = []
backtrack("",digits) #初始入口
return res
队列:
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits: return []
digitDict = { # 电话号码的数字对应字母字典
'2':['a','b','c'],
'3':['d','e','f'],
'4':['g','h','i'],
'5':['j','k','l'],
'6':['m','n','o'],
'7':['p','q','r','s'],
'8':['t','u','v'],
'9':['w','x','y','z']
}
queue = [''] # 初始化队列
print('len(queue):', len(queue)) # = 1
# 队列
for digit in digits:
print('digit:',digit)
for _ in range(len(queue)): # 队列非空
print('len(queue):', len(queue))
tmp = queue.pop(0) # 拿出第一个,最开始会是'',之后就是拼接的字母串
for letter in digitDict[digit]:# 遍历该轮数字的字母
queue.append(tmp + letter) # 拼接字母,入队
return queue
用队列模拟递归就相当于广度遍历,还可以用栈模拟递归相当于深度遍历。