17. 电话号码的字母组合

文章目录

题目

回溯:17. 电话号码的字母组合

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

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

示例 1:

输入:digits = "23"

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

示例 2:

输入:digits = "2"

输出:"a","b","c"

提示:

1 <= digits.length <= 4

digitsi 是范围 '2', '9' 的一个数字。

代码

cpp 复制代码
class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string>res;
        if(digits.length()==0){
            return res;
        }
        string tmp;
        unordered_map<char,string>u_map{
            {'2',"abc"},
            {'3',"def"},
            {'4',"ghi"},
            {'5',"jkl"},
            {'6',"mno"},
            {'7',"pqrs"},
            {'8',"tuv"},
            {'9',"wxyz"}
        };
        dfs(res,digits,0,tmp,u_map);
        return res;
    }
    void dfs(vector<string>&res,string &digits,int index,string &tmp,unordered_map<char,string>&u_map){
        if(index==digits.length()){
            res.push_back(tmp);
            return;
        }
        for(auto c:u_map[digits[index]]){
            tmp.push_back(c);
            dfs(res,digits,index+1,tmp,u_map);
            tmp.pop_back();
        }

    }
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

1、 边界条件

首先判断输入字符串 digits 是否为空,若为空直接返回空结果集 res,避免无效计算。

2、数字与字母的映射

使用哈希表 unordered_map 存储电话键盘上数字到对应字母的映射:

2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz

方便快速通过数字字符查找对应的字母集合。

  1. 临时存储

临时字符串 tmp:存储当前拼接的字母组合

结果集 res:用于存储所有符合要求的最终字母组合。

  1. 深度优先搜索(DFS)

调用递归函数 dfs,传入参数:结果集、输入数字串、当前遍历的数字下标(初始为 0)、临时字符串、字母映射表。

遍历所有数字,为每个数字选择一个字母,拼接成完整组合。

  1. DFS 递归终止条件

当递归下标 index 等于输入数字串的长度时,说明已经遍历完所有数字,完成了一次完整的字母拼接。

将此时的临时字符串 tmp 加入结果集 res,然后返回,结束当前递归分支。

  1. 递归遍历 + 回溯核心逻辑

取出当前下标对应数字的所有字母,循环遍历每一个字母:

选择字母:将当前字母添加到临时字符串 tmp 末尾(拼接组合)。

递归深入:下标 + 1,处理下一个数字,继续拼接字母。

回溯撤销:递归返回后,删除 tmp 末尾的字母(撤销当前选择),尝试循环中的下一个字母。

  1. 最终返回结果

所有递归分支执行完毕后,结果集 res 中存储了所有可能的字母组合,直接返回即可。

相关推荐
KaMeidebaby1 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
8Qi82 小时前
LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·二叉搜索树·lca·迭代
好评1242 小时前
【C++】智能指针全解
c++·智能指针
bIo7lyA8v2 小时前
算法稳定性分析中的随机扰动建模的技术8
算法
是阿建吖!2 小时前
【Linux】信号
android·linux·c语言·c++
城北徐宫2 小时前
Linux信号深度解剖:5种产生、3张表、4次切换
linux·c++·学习
liulilittle2 小时前
论 Linux 内核态全局稳态带宽的卡尔曼估计与工程实现
linux·服务器·网络·c++·计算机网络·tcp·通信
XBodhi.2 小时前
Visual Studio C++ 语法错误: 缺少“;”(在“return”的前面)
开发语言·c++·visual studio
科研online2 小时前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy3 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法