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'] 的一个数字。

三:思路

回溯

对于这种不同集合之间的组合,一开始会去想着,两个集合用两个for循环,三个集合三个for循环,但是我们无法去控制几个for循环,所以就想到用递归来控制for循环,再想到组合问题也需要用到回溯

  • 利用一个数组存储对应的下标的字符
  • 可以模拟构建一个树形结构
  • 横向拓展由for循环控制对digit的遍历
  • 纵向拓展由递归函数进行回溯
  • 需要注意该题是两个集合的组合,不是一个集合的组合,考虑用index变量控制

四:代码 + 复杂度分析

回溯+剪枝

js 复制代码
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    //回溯
    //用数组下标对应字符
    const map = ["", "", "abc", "def", "ghi","jkl", "mno", "pqrs", "tuv", "wxyz"]
    if(digits.length === 0) return []
    if(digits.length === 1) return map[digits].split("")
    //存储结果
    const res = []
    //单个结果
    const path = []
    const backtracking = (digits, index) => {
        if(digits.length === path.length) {
            //拼接起来
            //ad
            console.log(path)
            res.push(path.join(''))
            return 
        }
        for(let i of map[digits[index]]) {
            //['a', 'd']
            path.push(i)
            backtracking(digits, index + 1)
            path.pop()
        }
    }

    backtracking(digits, 0)
    return res
};
  • 时间复杂度:O(3 ^ m * 4 ^ m)

    • 在最坏情况下,每个数字都映射到一个包含 3 或 4 个字符的集合(例如,数字 '2' 对应 "abc",数字 '7' 对应 "pqrs")。
  • 空间复杂度: O(n + k)

    • res 数组用于存储最终的字母组合,因此其空间复杂度是 O(k),其中 k 表示可能的字母组合数量。
    • path 数组用于存储当前的组合路径,它的最大长度等于输入数字字符串的长度,因此其空间复杂度为 O(n),其中 n 表示输入数字字符串的长度。
相关推荐
wabs66611 分钟前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
hans汉斯12 分钟前
人工智能与机器人研究|面向无标签数据的三维场景语义理解方法研究
人工智能·神经网络·算法·信息可视化·cnn·机器人
阿坤带你走近大数据9 小时前
基金面试准备1
面试·职场和发展
小程故事多_8010 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_9561219712 小时前
二分算法(知识点+题目)
c++·算法
AndrewHZ15 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
职场的momo15 小时前
五年后端终面被追问方案,技术输出该如何守边界
职场和发展
小星星闪亮登场16 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶16 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾17 小时前
LeetCode 88 合并两个有序数组
算法·leetcode