给观众大佬业们上题目:
1.给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
思路:这时候,大佬业会怎么拆分这个问题呢?
让小菜鸟我,来露一手吧。
首先,菜鸟我直接将对应的字符存进列表中:
num_list=[['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']]
PS:当然你想用字典存储也可以,其他只要能存都可以喽~ ( > * n * < )~
然后,先得把digits(字符)进行分解为相应的数字吧,但是分解的前提是,你还要对digits的长度进行分类:
(1) 当digits长度为0时,可以直接进行输出为空“[ ]”
(2) 当digits长度为1时,可以直接直接将对应的(int)digits,But 要注意这里的索引值和对应题目给的对应的值之间相差2,因此 index=(int)digits-2
既然找到对应的索引值了,我们只要将num_list[index]进行返回即可
(3)当digits长度为2时,这里便涉及到不仅要分解对应的digits,还要进行将找到的两个index下的字符内容进行组合。
我图个方便和简单,因此直接用嵌套的循环直接实现。
代码如下:
class Solution(object):
def letterCombinations(self, digits):
num_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l'], ['m', 'n', 'o'], ['p', 'q', 'r', 's'], ['t', 'u', 'v'], ['w', 'x', 'y', 'z']]
# 先分解 digits,利用 list comprehension,转成整数并存储在列表中。
numbers = [int(i) for i in digits]
Ch_list = []
x = len(numbers)
if x == 0:
pass
elif x == 1:
a = numbers[0]-2
Ch_list = num_list[a]
elif x == 2:
a=numbers[0]-2
b=numbers[1]-2
for i in range(len(num_list[a])):
for j in range(len(num_list[b])):
Ch_list.append(num_list[a][i]+num_list[b][j])
return Ch_list
if __name__ == "__main__":
digits = "23"
solution = Solution()
result = solution.letterCombinations(digits)
print(result)
对于两个以内的数字组合,是可以的。但是对于三个以上的话再用循环的方法会超时,因此,我呢就看了看,官方给的解,代码如下:
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits:
return list()
phoneMap = {
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz",
}
def backtrack(index: int):
if index == len(digits):
combinations.append("".join(combination))
else:
digit = digits[index]
for letter in phoneMap[digit]:
combination.append(letter)
backtrack(index + 1)
combination.pop()
combination = list()
combinations = list()
backtrack(0)
return combinations
作者:力扣官方题解
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solutions/388738/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考官方给的解:
“方法一:回溯
首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。
回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。
回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解。在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接穷举所有的解即可。”
很好的一道题,使我认清我自己,真的菜鸟中的战斗机,菜鸟之王。
哈哈哈哈哈哈哈哈哈哈,魔怔了》》》》
诸位,等我前去参悟一下回溯和哈希表。
我只是一只初出茅庐的菜鸟,我菜我要练,我菜又咋滴。
? < ……………… ^…………………… "'' > ?
因此,这道题对菜鸟我来说还是挑战挺大的 \(` ^ `)/,害!
做题正如如修仙打怪,你且坚持潜行吧。
吾劝吾即吾劝君。