题目描述:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母
输入输出实例:
思路:这是一个全组合的问题,我们可以使用回溯法进行求解(如果给出的是空,我们也返回空列表,这个情况我们单独考虑一下),我们先把数字和字母的映射表构建出来(即构建一个字典)。然后定义一个递归函数backfind,输入参数是下标(用来从字典里面找字符串)和一个子列表(方便我们将每个小字符串添加到答案列表中)。在递归函数里遍历当前数字的所有可能字母,通过递归调用 backtrack
函数处理下一个数字。我们返回的列表里面的每一个字符串的长度都是和digits一样的,所以当我们子列表的长度和digits一样的时候,当前的子列表里面的内容就是答案列表的元素之一,我们就可以return到上一级了。根据上述思路我们可以有以下代码:
解法一:
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
nums_map = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs',
'8':'tuv','9':'wxyz'}
if not digits :
return []
def backfind(index,path):
if index == len(digits):
ans.append(''.join(path))
return
current = nums_map[digits[index]]
for i in current:
path.append(i)
backfind(index+1,path)
path.pop() #字符串添加到ans之后我们就把这个path的这个最后一个字符删去(比如实例一,我们把ae放到答案列表后,删除e,接着循环3的字符,把f放到子列表,子列表就变成了af)
ans = []
backfind(0,[])
return ans
解法二:
还有一个相对来说更简单的方法,python中有product函数专门用来处理计算所有字母列表的笛卡尔积,即所有可能的组合
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
nums_map = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs',
'8':'tuv','9':'wxyz'}
if not digits :
return []
group = [nums_map[digit] for digit in digits]
ans = [''.join(ans1) for ans1 in product(*group)]
return ans
两种解法都可以通过实例