给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
回溯法
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
'''回溯法'''
dic = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
res = [] # 存放返回的结果
path = [] # 存放路径的数组
if not digits:
return []
def back_track(str):
if len(path) == len(digits):
res.append(''.join(path)) # ''.join(path)表示将字符列表转化成字符串
else:
for i in dic[str[0]]: # 否则回溯
path.append(i) # 把候选值添加到path数组
back_track(str[1:]) # 继续回溯下一个
path.pop() # 回退
back_track(digits)
return res
队列法
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
'''队列法(类似与暴力遍历)
先让2对应的字母入队列,然后出对,每一个出对的字母再逐个结合3中的字母再入队,类比
'''
if not digits:
return []
phone = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
que = []
# 将第一个数字对应的字母全部入队列,减2是因为phone的下标相对偏移了2个位置
for i in phone[int(digits[0])-2]:
que.append(i)
if len(digits) > 1: # 如果digits不止一个数字,则开始入队遍历
for num in digits[1:]: # 需要遍历的趟数 = 所给的数字数目-1
for _ in range(len(que)): # 当前队列的所有字母都要出对重新组合
c = que.pop(0)
for i in phone[int(num)-2]: # 组合新的
que.append(c+i)
return que