【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板

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

📌 题目描述

题目级别:中等

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

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

  • 示例 1:

    输入:digits = "23"

    输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

  • 示例 2:

    输入:digits = ""

    输出:[]


💡 破题思路:DFS 深度优先搜索

这道题是经典的组合排列问题。核心思想是将按键数字映射到对应的字母表,然后通过深度优先搜索 (DFS) 逐层展开。

本套解法亮点(极简传值法):

  1. 精准映射 :在全局定义一个 let 数组,前两个元素设为空字符串 ""。这样可以直接通过 digs[u] - '0' 获取数字,完美对应数组下标,省去了复杂的偏移量计算。
  2. 传值拼接 :在递归函数的参数中直接传递拼接好的字符串 strr + let[num][i]。这种写法极其直观,代码量极少,非常符合人类顺着树形结构往下探索的直觉逻辑。
  3. 边界拦截 :针对 LeetCode 的特殊空串测试用例 "",在主函数入口处进行 if (digits.empty()) 特判拦截,防止误生成包含空字符串的数组。

💻 C++ 代码实现 (保留原汁原味)

cpp 复制代码
class Solution {
public:
    int n;
    vector<string> res;
    // 巧妙设计:下标直接对应数字,0和1为空
    vector<string> let = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    
    vector<string> letterCombinations(string digits) {
        n = digits.size();
        
        // 唯一需要注意的致命陷阱:特判空字符串
        if (n == 0) return res; 
        
        string str = "";
        dfs(digits, str, 0);

        return res;
    }

    void dfs(string digs, string strr, int u)
    {
        // 递归终止条件:当前组合的长度等于输入的数字长度
        if (strr.size() == digs.size())
        {
            res.push_back(strr);
            return ;
        }
        
        // 利用直接映射获取当前数字
        int num = digs[u] - '0';
        
        // 遍历该数字对应的所有字母
        for (int i = 0; i < let[num].size(); i++)
        {
            // 直接在传参时进行字符串拼接,隐式完成了回溯的回退过程
            dfs(digs, strr + let[num][i], u + 1);
        }
    }
};
相关推荐
信奥卷王2 分钟前
2025年09月GESPC++五级真题解析(含视频)
算法
白狐_7982 分钟前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
汉克老师6 分钟前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹8 分钟前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
汉克老师26 分钟前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码32 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
leihefeng39 分钟前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
影视飓风TIM1 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
全栈技术负责人1 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_31 小时前
面试题 02.07. 链表相交
算法·链表