LeetCode-17. 电话号码的字母组合【哈希表 字符串 回溯】

LeetCode-17. 电话号码的字母组合【哈希表 字符串 回溯】

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述
示例 1:

输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:

输入:digits = “”
输出:[]
示例 3:

输入:digits = “2”
输出:[“a”,“b”,“c”]

提示:

0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

解题思路一:回溯三部曲:

  1. 确定回溯函数参数
    首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量我依然定义为全局。

再来看参数,参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index。

注意这个index可不是 77.组合 (opens new window)和216.组合总和III (opens new window)中的startIndex了。

这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。
2. 确定终止条件
例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。

那么终止条件就是如果index 等于 输入的数字个数(digits.size)了(本来index就是用来遍历digits的)。

然后收集结果,结束本层递归。
3. 确定单层遍历逻辑
首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。注意这里for循环,可不像是在回溯算法:求组合问题! (opens new window)和回溯算法:求组合总和! (opens new window)中从startIndex开始遍历的。

因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而77. 组合 (opens new window)和216.组合总和III (opens new window)都是求同一个集合中的组合!

注意:输入1 * #按键等等异常情况

代码中最好考虑这些异常情况,但题目的测试数据中应该没有异常情况的数据,所以我就没有加了。

但是要知道会有这些异常,如果是现场面试中,一定要考虑到!

class Solution:
    def __init__(self):
        self.letterMap = {
            0: "",
            1: "",
            2: "abc",
            3: "def",
            4: "ghi",
            5: "jkl",
            6: "mno",
            7: "pqrs",
            8: "tuv",
            9: "wxyz",
        }
    def letterCombinations(self, digits: str) -> List[str]:
        res = []
        if len(digits) == 0:
            return res
        self.backtracking(digits, 0, "", res)
        return res
    def backtracking(self, digits, index, s, res):
        if len(s) == len(digits):
            res.append(s)
            return
        digit = int(digits[index])
        letters = self.letterMap[digit]
        for letter in letters:
            self.backtracking(digits, index + 1, s + letter, res)

时间复杂度:O(3m ×4n)
空间复杂度:O(n) 其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。

解题思路二:回溯

class Solution:
    def __init__(self):
        self.letterMap = [
            "",     # 0
            "",     # 1
            "abc",  # 2
            "def",  # 3
            "ghi",  # 4
            "jkl",  # 5
            "mno",  # 6
            "pqrs", # 7
            "tuv",  # 8
            "wxyz"  # 9
        ]
        self.result = []
        self.s = ""
    
    def backtracking(self, digits, index):
        if index == len(digits):
            self.result.append(self.s)
            return
        digit = int(digits[index])    # 将索引处的数字转换为整数
        letters = self.letterMap[digit]    # 获取对应的字符集
        for i in range(len(letters)):
            self.s += letters[i]    # 处理字符
            self.backtracking(digits, index + 1)    # 递归调用,注意索引加1,处理下一个数字
            self.s = self.s[:-1]    # 回溯,删除最后添加的字符
    
    def letterCombinations(self, digits):
        if len(digits) == 0:
            return self.result
        self.backtracking(digits, 0)
        return self.result

时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:


时间复杂度:O(n)
空间复杂度:O(n)

相关推荐

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

    2024-04-07 04:20:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 04:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 04:20:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 04:20:02       82 阅读
  4. Python语言-面向对象

    2024-04-07 04:20:02       91 阅读

热门阅读

  1. 嵌入式中基于QT的开源串口调试工具

    2024-04-07 04:20:02       41 阅读
  2. 判断三点是否在一直线上

    2024-04-07 04:20:02       44 阅读
  3. OpenFOAM代码

    2024-04-07 04:20:02       44 阅读
  4. Day4-Hive直播行业基础笔试题

    2024-04-07 04:20:02       30 阅读
  5. 【Leetcode 347】,前k个高频元素,小根堆的调整

    2024-04-07 04:20:02       135 阅读
  6. OpenAI称其正在研究模仿人类声音的人工智能

    2024-04-07 04:20:02       43 阅读
  7. 》shader命令《--材质函数整理

    2024-04-07 04:20:02       40 阅读