leetCode 17.电话号码的字母组合 + 回溯算法 + 图解 + 笔记

17. 电话号码的字母组合 - 力扣(LeetCode)


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

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

本题需要解决三个问题,思考和分析:

  • (1)数字和字母集合如何做映射
  • (2)两个字母就需要两个for循环,那很多个字母岂不是要很多层for循环嵌套,怎么解决?、
  • (3)输入1 * #按键等等异常情况

解决思路:1.创建字符集(使数字和字母集做映射) 

const string letterMap[10] = {"",     // 0"",     // 1"abc",  // 2"def",  // 3"ghi",  // 4"jkl",  // 5"mno",  // 6"pqrs", // 7"tuv",  // 8"wxyz", // 9
};

2.回溯算法来解决 for 循环的问题,举个栗子:输入"23",长度为 2

  • 回溯可以通过递归的方式来帮我们去实现嵌套几个for循环

  • 输入"23" 的长度为 2,正是树的深度
  • 叶子节点要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

>>回溯三部曲:

1).确定回溯函数参数

  • 字符串 strPath 来收集叶子节点的结果 
  • result 保存 strPath,作为结果集
  • index 是记录遍历第几个数字了,同时 index 也表示树的深度
vector<string> result;
string strPath;
void backtracking(const string& digits, int index)

2).确定终止条件

  • 如果 index 等于 输入的数字个数(digits.size)了,就终止,这是因为 index 就是用来遍历digits
  • 举个栗子:"23",有两个数字,那么根节点往下递归两层就可以了
  • 收集结果,结束本层递归
if(index == digits.size()) {result.push_back(strPath);return;
}

3).确定单层遍历逻辑

  • 先取出 index digits 中的数字,再取找出对应的字符集
  • 接着 for 循环处理这个字符集
int num = digits[index]-'0';// 将index指向的数字转为int
string charSet = letterMap[num];// 取数字对应的字符集
for(int i=0;i<charSet.size();i++) {strPath.push_back(charSet[i]);// 处理backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了strPath.pop_back();// 回溯
}

C++ 代码: 

class Solution {
public:vector<string> result;string strPath;const string letterMap[10] = {"",     // 0"",     // 1"abc",  // 2"def",  // 3"ghi",  // 4"jkl",  // 5"mno",  // 6"pqrs", // 7"tuv",  // 8"wxyz", // 9};void backtracking(const string& digits,int index) {if(index == digits.size()) {result.push_back(strPath);return;}int num = digits[index]-'0';// 将index指向的数字转为intstring charSet = letterMap[num];// 取数字对应的字符集for(int i=0;i<charSet.size();i++) {strPath.push_back(charSet[i]);// 处理backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了strPath.pop_back();// 回溯}}vector<string> letterCombinations(string digits) {if (digits.size() == 0) return result;backtracking(digits,0); return result;}
};

参考和推荐文章,视频: 

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html#%E6%80%9D%E8%B7%AF还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1yV4y1V7Ug/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/227654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类指针压缩空间

一、类指针压缩介绍 压缩指针&#xff0c;指的是在 64 位的机器上&#xff0c;使用 32 位的指针来访问数据&#xff08;堆中的对象或 Metaspace 中的元数据&#xff09;的一种方式。 对象头中的 Class Pointer 默认占 8 个字节&#xff0c;开启 -XX:UseCompressedOops 后&…

文本生成超逼真歌曲,谷歌推出音乐模型Lyria

转换示例 谷歌旗下的DeepMind与视频平台YT合作&#xff0c;发布了目前最先进的音乐模型——Lyria。 为了突破传统音乐模型的生硬机器感&#xff0c;谷歌汇集了多个部门并与Charlie Puth、T-Pain、Troye Sivan等9位知名音乐人共同研发了Lyria。 Lyria可生成爵士、重金属、摇滚…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列&#xff08;day 07&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

在centos7上源码安装nginx

1. 安装必要的编译工具和依赖项 在编译Nginx之前&#xff0c;你需要安装一些编译工具和依赖项。可以通过以下命令安装&#xff1a; yum install gcc-c pcre-devel zlib-devel make 2. 下载Nginx源代码 从Nginx官网下载最新的源代码。你可以使用wget命令来下载&#xff1a; …

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符&#xff1a;匹配的是文件名 正则表达式&a…

【读论文】【泛读】S-NERF: NEURAL RADIANCE FIELDS FOR STREET VIEWS

文章目录 0. Abstract1. Introduction2. Related work3. Methods-NERF FOR STREET VIEWS3.1 CAMERA POSE PROCESSING3.2 REPRESENTATION OF STREET SCENES3.3 DEPTH SUPERVISION3.4 Loss function 4. EXPERIMENTS5. ConclusionReference 0. Abstract Problem introduction&…

REST-Assured--JAVA REST服务自动化测试的Swiss Army Knife

什么是REST-Assured REST Assured是一套基于 Java 语言实现的开源 REST API 测试框架 Testing and validation of REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into t…

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】 1. 掌握简单gdb使用于调试 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上 1.Linux调试器-gdb使用 1.1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式release模式不可被调试&#xff0c;debug模式可被调试Linux gcc/g出来的二进制…

kali linux nmap 端口扫描 简单教程

本次实验所用工具如下&#xff1a; VMwarekali linux (namp扫描工具)Windows sever 2016 需开启&#xff08;FTP&#xff0c;smp&#xff0c;Telnet&#xff0c;rdp&#xff09;端口namp操作所用部分代码&#xff1a; -sP ping 扫描 -P 指定端口范围 -sV 服务版本探测 -A …

易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]

文章目录 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章…

GitLab 登录中,LDAP和 Standard 验证有什么区别

在 GitLab 中&#xff0c;LDAP&#xff08;Lightweight Directory Access Protocol&#xff09;和 Standard 验证是两种不同的身份验证方法&#xff0c;它们有以下区别&#xff1a; LDAP&#xff08;Lightweight Directory Access Protocol&#xff09;身份验证&#xff1a; L…

WIFI HaLow技术引领智能互联,打破通信限制

在过去十年里&#xff0c;WIFI技术已在家庭和企业中建立起了庞大的网络&#xff0c;连接了数十亿智能互联设备&#xff0c;促进了信息的迅速传递。然而&#xff0c;当前的WIFI标准存在一些挑战&#xff0c;包括协议范围的限制和整体功能的受限&#xff0c;导致在较远距离进行通…