同样是两道中等难度题目,但题目间没啥关联:第一道类似于我们之前按键手机时代九键输入组合的展示,第二道题将昨天的三数之和改造成了四数之和。现在做题,有时候做着做着提交通过了,就不愿深挖了,挺偷懒的,希望写题记时可以多拓展学习下。
题目一
第 17 题 电话号码的字母组合:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
好吧,数字 1 键还没内容,叫它八键组合得了。
思路
首先是数字转字母的过程:我们输入 “23” 那么要先取到 “2” 对应的 “abc” 和 “3” 对应的 “def”。然后我们将二者拆分组合得到结果。
数字转字母这个过程,吸取之前题目中的经验,事先写好一个不同数字对应不同字母的字典,一来哈希字典方便快速查找,二来也省的代码提取麻烦。
将字母串拆分组合这步,没想到特别好的方法,我是先把 “abc” 转化成单字母列表,遍历 “def” 每一步都在之前的列表所有元素尾加上新遍历的字母,不断扩充列表拿到结果,细节我们看代码。
代码
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
# 如果输入空字符串,返回空列表
if digits=="":
return []
# 用字典存好数字与字母的对应关系
table = {
"2":"abc","3":"def","4":"ghi","5":"jkl","6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}
# digits[0] 即输入字符串的第一位数字,table[该数字]取到对应字母串,转成列表
lst = list(table[digits[0]])
# 获取输入数字串长度用于遍历
l = len(digits)
i=1
# while 循环对每一位数字进行一次处理
while i<l:
# temp_sum 列表用与循环中保存生成的结果
temp_sum=[]
# 对第 i