【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)

☎️ LeetCode 17. 电话号码的字母组合(回溯 + DFS + 详解)

📌 题目描述

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

数字到字母的映射如下(与电话按键相同):

复制代码
2 -> abc
3 -> def
4 -> ghi
5 -> jkl
6 -> mno
7 -> pqrs
8 -> tuv
9 -> wxyz

示例:

复制代码
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

💡 解题思路

这道题属于回溯算法的经典题型。类似的题目还有全排列、子集生成等。

✅ 关键点:

  1. 每一位数字对应多个字母,需要依次尝试。
  2. 每次从当前位置开始尝试不同的字母,然后递归地构建下一个字符。
  3. 递归出口是当组合长度等于输入数字的长度。

✍️ 回溯结构大致如下:

go 复制代码
func backtrack(path string, index int) {
    if len(path) == len(digits) {
        res = append(res, path)
        return
    }
    for _, ch := range digitMap[digits[index]] {
        backtrack(path + string(ch), index + 1)
    }
}

💻 Go 实现代码

go 复制代码
func letterCombinations(digits string) []string {
    if digits == "" {
        return []string{}
    }

    digitMap := map[byte]string{
        '2': "abc", '3': "def", '4': "ghi",
        '5': "jkl", '6': "mno", '7': "pqrs",
        '8': "tuv", '9': "wxyz",
    }

    var res []string

    var backtrack func(index int, path string)
    backtrack = func(index int, path string) {
        if index == len(digits) {
            res = append(res, path)
            return
        }

        letters := digitMap[digits[index]]
        for i := 0; i < len(letters); i++ {
            backtrack(index+1, path+string(letters[i]))
        }
    }

    backtrack(0, "")
    return res
}

⏱️ 复杂度分析

项目 复杂度
时间复杂度 O(3\^n \\cdot 4\^m),其中 n 是出现 3 个字母的数字个数,m 是出现 4 个字母的数字个数
空间复杂度 O(n),递归调用栈的深度

🔍 小技巧和注意点

  • 初始条件:空字符串 "" 应该直接返回空结果;
  • 回溯问题一般都要设计好递归的「终止条件」;
  • Go 语言中字符串拼接 path + string(char) 会创建新字符串,避免影响回溯路径;
  • 用 map 存储 digit → 字母 的映射比硬编码效率更高、代码更清晰。

🎯 总结

内容 要点
核心思想 回溯法构造所有可能组合
数据结构 map(映射),递归
解题模板 回溯常规套路:终止条件 + for 循环尝试每一种选择
常见考点 字符组合、搜索树、剪枝优化(可选)

📚 类似题推荐


💡 小结:

本题是回溯法的经典入门题,重点在于理解「每一步做选择 + 撤销选择」的模式。掌握之后,可以举一反三解决其他排列组合类问题。


如果你喜欢这样的讲解风格,欢迎 点赞 👍 收藏 ⭐ 评论 📝,我会持续带来更多高质量的 LeetCode 题解!

相关推荐
何似在人间575几秒前
Go语言快速入门教程(JAVA转go)——1 概述
java·开发语言·golang
hweiyu0031 分钟前
C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
c++·算法·设计模式
大千AI助手1 小时前
粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
人工智能·算法·优化算法·pso·粒子群优化
我叫汪枫1 小时前
C语言深度入门系列:第十一篇 - 动态内存管理与数据结构:程序世界的高效算法大师
c语言·数据结构·算法
Li_7695321 小时前
优选算法100 题 ——1 双指针
算法
77qqqiqi1 小时前
算法——数学基础
算法
啊?啊?1 小时前
7 排序算法通关指南:从 O (n²)(选择 / 冒泡)到 O (nlogn)(快排 / 归并)+ 计数排序
数据结构·算法·排序算法
张较瘦_1 小时前
[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案
论文阅读·算法·哈希算法
芒克芒克1 小时前
LeetCode 面试经典 150 题:多数元素(摩尔投票法详解 + 多解法对比)
算法·leetcode·面试
wow_DG1 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(二):虚拟 DOM 与 Diff 算法
开发语言·javascript·vue.js·算法·前端框架