当前位置: 首页 > news >正文

LeeCode_17 电话号码的字母组合

17. 电话号码的字母组合

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

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

image-9

示例 1:

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

class Solution {
public:vector<string> letterCombinations(string digits) {// 用于存储最终结果的字符串数组vector<string> combinations;// 如果输入为空,直接返回空数组(边界情况处理)if (digits.empty()) {return combinations;}// 建立数字到字母的映射哈希表// key: 电话按键字符 (char), value: 对应的字母字符串unordered_map<char, string> phoneMap{{'2', "abc"}, {'3', "def"},  {'4', "ghi"}, {'5', "jkl"},{'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};// combination: 临时字符串,用于存储当前递归路径上的字母组合string combination;// 调用回溯函数,从第 0 个索引开始处理backtrack(combinations, phoneMap, digits, 0, combination);return combinations;}void backtrack(vector<string>& combinations,const unordered_map<char, string>& phoneMap,const string& digits, size_t index, string& combination) {// --- 递归终止条件 ---// 当 index 等于字符串长度时,说明已经处理完了所有数字if (index == digits.length()) {// 将当前生成的完整组合存入结果集combinations.push_back(combination);return; // 结束当前分支}// 获取当前 index 位置对应的数字字符char digit = digits[index];// 从映射表中获取该数字对应的所有字母字符串const string& letters = phoneMap.at(digit);// --- 遍历当前数字的所有可能字母 ---for (const char& letter : letters) {// 【做选择】:将当前字母加入临时字符串combination.push_back(letter);// 【递归】:处理下一个数字 (index + 1)// 注意这里传入的是 index + 1,表示深入下一层backtrack(combinations, phoneMap, digits, index + 1, combination);// 【回溯/撤销选择】:// 递归返回后,需要把刚才加入的字母删掉,以便尝试当前层的下一个字母// 这就是“回溯”的核心:状态重置combination.pop_back();}}
};
class Solution {
public:// temp: 用于临时存储当前正在构建的字母组合(路径)string temp;// res: 用于存储最终所有符合条件的字母组合结果vector<string> res;// board: 电话号码按键映射表,下标 0-9 分别对应按键上的字母// 比如 board[2] = "abc",代表按键 '2' 对应字母 a, b, cvector<string> board = {"",    "",    "abc",  "def", "ghi","jkl", "mno", "pqrs", "tuv", "wxyz"};void DFS(int pos, string digits) {// 递归终止条件:当 pos 等于字符串长度时// 说明已经处理完了所有的数字,temp 中存储了一个完整的组合if (pos == digits.size()) {res.push_back(temp); // 将当前完整的组合存入结果集return;              // 结束当前递归分支,返回}// 获取当前位置对应的数字字符,并将其转换为整型索引// 例如:digits 是 "23",pos=0 时,digitVal='2',num=2int num = digits[pos] - '0';// 遍历当前数字对应的所有字母// 例如:按键 '2' 对应 "abc",循环就是 a -> b -> cfor (int i = 0; i < board[num].size(); i++) {// --- 处理节点 ---// 将当前字母加入到临时组合 temp 的末尾temp.push_back(board[num][i]);// --- 递归调用 (进入下一层) ---// 处理下一个数字的位置 (pos + 1)DFS(pos + 1, digits);// --- 回溯操作 (撤销处理) ---// 关键步骤:递归返回后,把刚才加入的字母删除// 这样才能在循环的下一次迭代中,尝试同一个按键的下一个字母// 比如试完 'a' 后,删掉 'a',才能去试 'b'temp.pop_back();}}// 主函数vector<string> letterCombinations(string digits) {// 特判:如果输入为空字符串,直接返回空结果if (digits.size() == 0) {return res;}// 从下标 0 开始进行深度优先搜索DFS(0, digits);// 返回最终生成的所有组合return res;}
};
http://www.jsqmd.com/news/264114/

相关文章:

  • Selenium 从环境搭建到 Web 自动化实战
  • 通信原理篇---PAM与PCM
  • GESP认证C++编程真题解析 | 202309 四级
  • P1339 Heat Wave G
  • P2910 Clear And Present Danger S
  • 职场晋升需要 AI 证书,选偏理论还是偏实操的更有用?
  • TCP 协议深度解析与实践:从零基础到精通
  • 小程序毕设选题推荐:基于springboot+微信小程序的校园竞赛管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • > STM32-200-多功能门禁人脸识别指纹识别RFID刷卡密码(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 数据质量与主数据管理:确保企业核心数据准确
  • 51-C40-温湿度检测+上下限+加热+空调降温+加湿+除湿+手动+自动+OLED屏+声光报警+按键+(无线方式选择)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 假期schedule
  • 数论2:gcd、lcm与exgcd
  • 计算机小程序毕设实战-基于SpringBoot+Vue的高校学科竞赛管理系统微信小程序基于springboot+微信小程序的院竞赛管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • day144—递归—平衡二叉树(LeetCode-110)
  • 2026年市场可靠的活性炭箱优质厂家哪家靠谱,滤筒除尘器/旋风除尘器/活性炭箱/催化燃烧,活性炭箱生产商口碑排行 - 品牌推荐师
  • STM32单片机分享:智能鱼缸系统
  • 2026年国内可靠的活性炭箱制造厂家推荐排行榜,RTO/旋风除尘器/沸石转轮一体机/除尘器,活性炭箱公司推荐榜 - 品牌推荐师
  • 交通仿真软件:VISSIM_(22).交通仿真在城市规划中的应用
  • STM32单片机分享:智能书桌系统
  • day145—递归—二叉树的右视图(LeetCode-199)
  • 理性选择RTO:基于用户反馈的供货商横向评测,沸石转轮/活性炭箱/RTO/沸石转轮一体机,RTO源头厂家排行榜 - 品牌推荐师
  • 小程序计算机毕设之基于微信小程序的大学生科技竞赛管理系统的设计与实现基于springboot+微信小程序的院竞赛管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 2026苏州新房装修大揭秘:这些服务优质的公司你不能错过! - 品牌测评鉴赏家
  • Flink Elasticsearch Connector 从 0 到 1 搭一个高吞吐、可容错的 ES Sink
  • Flink Firehose Sink 把实时流数据稳定写进 Amazon Kinesis Data Firehose
  • GESP认证C++编程真题解析 | 202309 五级
  • vscode的.vscode文件记录
  • 人工智能之数据分析 Pandas:第九章 性能优化 - 实践
  • 2026年国内最好的沸石转轮+CO定制厂家口碑推荐榜单,除尘器/沸石转轮一体机/滤筒除尘器/催化燃烧,沸石转轮生产商排名 - 品牌推荐师