码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 17. 电话号码的字母组合

时间:2020-06-09 18:34:21      阅读:43      评论:0      收藏:0      [点我收藏+]

标签:执行   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%的用户

LeetCode 17. 电话号码的字母组合

标签:执行   letters   很多   映射   elf   return   leetcode   str   想法   

原文地址:https://www.cnblogs.com/xiaoqiangink/p/13074497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!