LeetCode——Hot 100【电话号码的字母组合】

题目:电话号码的字母组合

题目分析

题目要求

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合(答案可以按任意顺序返回)。数字到字母的映射与电话按键相同(如 2 对应 abc3 对应 def 等)。

示例

  • 示例 1:输入 digits = "23",输出 ["ad","ae","af","bd","be","bf","cd","ce","cf"]
  • 示例 2:输入 digits = "2",输出 ["a","b","c"]

解题思路

这道题可以通过 ** 深度优先搜索(DFS)** 来解决,属于典型的 "组合枚举" 类问题。

核心思路

对于输入字符串中的每一个数字,我们需要枚举其对应的所有字母,并将这些字母与后续数字的字母进行组合。具体来说:

  1. 首先建立数字到字母的映射表。
  2. 从第一个数字开始,递归地枚举每个数字对应的所有字母,将字母加入临时组合字符串中。
  3. 当递归到输入字符串的末尾时,将当前的临时组合字符串加入结果集。

代码详解

数据结构与全局变量

  • vector<string> ret:用于存储最终的所有字母组合结果。
  • string path:用于存储递归过程中的临时字母组合(类似 "路径")。
  • vector<string> bor:数字到字母的映射表,bor[0]bor[1] 无意义(因为题目中数字是 2-9),bor[2] = "abc" 对应数字 2 的字母,以此类推。
cpp 复制代码
class Solution {
public:
    vector<string> ret;
    string path;
    vector<string> bor = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

DFS 递归函数

dfs 函数负责递归枚举所有可能的字母组合,参数 pos 表示当前处理到输入字符串 digits 的第几个字符,nums 是输入的数字字符串。

cpp 复制代码
    void dfs(int pos, string nums) {
        // 递归终止条件:当处理完所有数字时,将当前路径加入结果集
        if (pos == nums.size()) {
            ret.push_back(path);
            return;
        }
        // 获取当前数字(将字符转换为数字)
        int n = nums[pos] - '0';
        // 枚举当前数字对应的所有字母
        for (int i = 0; i < bor[n].size(); i++) {
            // 选择:将当前字母加入路径
            path.push_back(bor[n][i]);
            // 递归:处理下一个数字
            dfs(pos + 1, nums);
            // 回溯:撤销选择,以便枚举下一个字母
            path.pop_back();
        }
    }

完整代码:

cpp 复制代码
class Solution {

public:
     vector<string>ret;
     string path;
     vector<string> bor={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
     void dfs(int pos,string nums)
     {
        if(pos==nums.size())
        {
            ret.push_back(path);
            return;
        }
        int n=nums[pos]-'0';
        for(int i=0;i<bor[n].size();i++)
        {
            path.push_back(bor[n][i]);
            dfs(pos+1,nums);
            path.pop_back();
        }
     }
     vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
        return ret;
        dfs(0,digits);
        return ret;

    }
};
相关推荐
123_不打狼10 分钟前
AE(自编码器)与 VAE(变分自编码器)核心区别:原理、目标与应用
深度学习·算法·机器学习·vae
Anastasiozzzz13 分钟前
LeetCode hot100 45 跳跃游戏2
算法·leetcode·游戏
近津薪荼15 分钟前
递归专题(3)——反转链表
数据结构·c++·学习·算法·链表
Tisfy17 分钟前
LeetCode 3013.将数组分成最小总代价的子数组 II:两个堆维护k-1小 + 滑动窗口
算法·leetcode·题解·优先队列··有序集合·滑动窗口
坚持就完事了20 分钟前
Java算法:递归
算法
senijusene23 分钟前
数据结构与算法:完全二叉树和非完全二叉数的各种详细操作以及哈希表的简单应用
数据结构·算法·链表
季明洵1 小时前
反转字符串、反转字符串II、反转字符串中的单词
java·数据结构·算法·leetcode·字符串
2401_841495641 小时前
【Python高级编程】近似串匹配
python·算法·动态规划·字符串·数组·时间复杂度·空间复杂度
lingggggaaaa1 小时前
安全工具篇&魔改二开&CheckSum8算法&Beacon密钥&Stager流量&生成机制
学习·算法·安全·web安全·网络安全·免杀对抗
Python+JAVA+大数据1 小时前
SQL玩出算法竞赛高度!郑凌云数独算法:递归CTE+位运算DFS回溯全解析
数据库·sql·算法·搜索引擎·深度优先·dfs