题目描述:给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。下图的手机按键图,就表示了每个数字可以代表的字母。
与上一题“组合”(详见:点击打开链接)的思路是一致的,用的还是深搜 + 递归这样的模式。
首先,可以先构造一个数字与字母相对应的数组,比如,可以写成这个形式:
num_alp_table = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
显然,num_alp_table中每个元素的索引是对应数字,而元素本身是这个数在手机键盘上对应的字母。
与之前“组合”的解决方法类似,我们此处还是写一个辅助函数helper(),helper()函数一共有5个参数:
digits:用户输入的数字字符串
num_alp_table:上面才说过
begin:当前需要处理的数字字符串的位置,比如,输入“23”,初始时,begin = 0,也就是处理“23”这个字符串的第0位“2”
path:记录字母组合的字符串
result:结果列表
helper()函数做的事情就是将数字字符串从begin开始到最后依次处理,将每一种可能的字母组合添加到结果列表中。深搜回溯的条件是len(path) == len(digits)
代码如下:
class Solution:
# @param {string} digits A digital string
# @return {string[]} all posible letter combinations
def letterCombinations(self, digits):
num_alp_table = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
if len(digits) == 0:
return []
path, result = "", []
begin = 0
self.helper(digits, begin, path, result, num_alp_table)
return result
def helper(self, digits, begin, path, result, num_alp_table):
# 深搜触底,回溯
if len(path) == len(digits):
result.append(path)
return
# 遍历某个数字代表的所有字母
for i in num_alp_table[int(digits[begin])]:
path += i
# 从下一位开始,到最后的组合情况
self.helper(digits, begin + 1, path, result, num_alp_table)
path = path[:-1]
# Write your code here