标签:执行 letters 很多 映射 elf return leetcode str 想法
题目:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
思路
首先测试用例的异常情况得考虑:非2-9以外的数字组合都是返回[],为空的时候也要返回[]。
创建一个letter map,用于取case,感觉情况很多,所以首先想到的是递归思想,递归思想的核心是写好当前和下一次动作,不过,没构思好怎么写...??,基本功不扎实,思考许久,还是去评论题解取精了.
方法一:
果然,还是基本功不扎实,没能把递归思想的逻辑用code实现出来,应该是有想法不知道怎么实现..题解的思路跟我想的一样,而且处理也很简单,Q_Q,再接再厉
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
output = []
letter_map = {‘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(digits) ==0: return [] #为空时return[]
for key in digits:
if key not in letter_map.keys():return [] #数字不在map中return[]
def backtrack(combination, next_digits):
if len(next_digits) == 0: #长度为0时代表所有数字已取出
output.append(combination)
else:
for letter in letter_map[next_digits[0]]:#选择一位作为字串累加
backtrack(combination + letter, next_digits[1:]) #送去下一位数字
backtrack("", digits)
return output
执行用时 :12 ms, 在所有 Python 提交中击败了97.12%的用户
内存消耗 :12.7 MB, 在所有 Python 提交中击败了5.26%的用户
方法二:
记录下题解作者王尼玛大大的处理过程,好像不止一次参考分享他的解题思路了...小弱弱还是小弱弱,大大还是那个大大阿,?? 不过有几处不是很理解,所以有做修改,更容易理解,核心思想和方法一是一样的,循环递归。
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
letter_map = {
"2":"abc",
"3":"def",
"4":"ghi",
"5":"jkl",
"6":"mno",
"7":"pqrs",
"8":"tuv",
"9":"wxyz"
}
# 注意边界条件
if len(digits) ==0:
return [] #为空时return[]
for key in digits:
if key not in letter_map.keys():#数字不在map中return[]
return []
# 最终输出结果的list
res = []
# 递归函数
def dfs(tmp,index):
# index记录每次遍历到字符串的位置
if index==len(digits): #递归的终止条件,从0开始,当等于str长度时中止。
res.append(tmp)
return res
num = digits[index] #取当前str数字
letters = letter_map[num] #取str 对应map中的字符串
for i in letters:
dfs(tmp+i,index+1)# 调用下一层递归
dfs("",0) #递归从0开始
return res
方法三:
这里记录另一个方法, 同样来自王尼玛大大的解题分享,队列的先进先出原则,进行依次累加。
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
letter_map = {
"2":"abc",
"3":"def",
"4":"ghi",
"5":"jkl",
"6":"mno",
"7":"pqrs",
"8":"tuv",
"9":"wxyz"
}
# 注意边界条件
if len(digits) ==0:
return [] #为空时return[]
for key in digits:
if key not in letter_map.keys():
return [] #数字不在map中return[]
# 最终输出结果的list
res = [""]
for i in digits:
size = len(res)
# 由当前遍历到的字符,取字典表中查找对应的字符串
letters = letter_map[i]
# 计算出队列长度后,将队列中的每个元素挨个拿出来
for _ in xrange(size):
# 每次都从队列中拿出第一个元素
tmp = res.pop(0)
# 然后跟"def"这样的字符串拼接,并再次放到队列中
for j in letters:
res.append(tmp+j)
return res
执行用时 :16 ms, 在所有 Python 提交中击败了87.44%的用户
内存消耗 :12.7 MB, 在所有 Python 提交中击败了5.26%的用户
标签:执行 letters 很多 映射 elf return leetcode str 想法
原文地址:https://www.cnblogs.com/xiaoqiangink/p/13074497.html