【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 题解!

相关推荐
智驱力人工智能3 小时前
AI移动监测:仓储环境安全的“全天候守护者”
人工智能·算法·安全·边缘计算·行为识别·移动监测·动物检测
你采不起的野花4 小时前
Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析
游戏·golang·lua
代码小将4 小时前
力扣992做题笔记
算法·leetcode
编程绿豆侠4 小时前
力扣HOT100之二叉树:199. 二叉树的右视图
算法·leetcode·职场和发展
程序员爱钓鱼5 小时前
defer关键字:延迟调用机制-《Go语言实战指南》
开发语言·后端·golang
wktomo5 小时前
GO语言学习(五)
学习·golang·web3
免檒5 小时前
Go内存管理
开发语言·网络·golang·操作系统
CodeWithMe5 小时前
【Go】从0开始学习Go
开发语言·学习·golang
蒟蒻小袁5 小时前
力扣面试150题--从前序与中序遍历序列构造二叉树
算法·leetcode·面试