题目介绍
难度: 中等
算法:递归
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
电话键对应字母如下:
1 2:abc 3:def
4:ghi 5:jkl 6:mno
7:pqrs 8:tuv 9:wxyz
算法解析
递归:定义就不必多说了,干这行的应该都知道,不知道的度娘一下。
重点说一下递归函数三要素:
- 确定函数的功能及输入输出
- 找出结束递归的条件,即递归结束返回的起点
- 找到函数的等价关系,即继续调用函数的表达式
举个例子,斐波那契数列
- 确定函数功能:求斐波那契数列第n项的值
def f(n) :
- 找出结束递归的条件:先考虑特殊情况f(1)=f(2)=1
def f(n) :
if (n <= 2)
return 1
- 找出函数的等价关系:根据斐波那契数列的规律,f(n) = f(n-2) + f(n-1)
def f(n):
if (n <= 2)
return 1
return f(n-1) + f(n-2)
是不是很简单?😃
一锤定音
回到正题上来,我们也按照这三部走。
- 确定函数功能:参数为数字字符串,记得后边要转为int型查找对应的字母;返回值应该是所有数字对应的字母之间的组合。
def num_letter_combination(nums):
- 递归结束条件:特殊情况 nums为空;当入参为一个数字时,返回对应的字母序列。
def num_letter_combination(nums):
num_letter_dic = {
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']
}
if len(nums) == 0:
return []
if len(nums) == 1: # 递归结束条件
return num_letter_[int(nums[0])]
- 找出函数的等价关系:因为递归结束条件为一个数字代表的字母,所以我们每次取[1:],并使递归结束的数字对应的字母与nums[0]对应的字母相加,累加到最终输出列表
res = num_letter_combination(nums[1:])
for r in res:
for j in num_letter_dic[int(nums[0])]:
final_res.append(j + r) # final_res 为最终输出的字符串列表
整个函数的定义:
def num_letter_combination(nums):
num_letter_dict = {
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']
}
final_res = []
if len(nums) == 0:
return []
if len(nums) == 1:
return num_letter_dict[int(nums[0])]
res = self.num_letter_combination(nums[1:])
for i in res:
for j in num_letter_dict[int(nums[0])]:
final_res.append(i+j)
return final_res