LeetCode刷题笔记:17.电话号码的字母组合
1. 问题描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
2: “abc”,
3: “def”,
4: “ghi”,
5: “jkl”,
6: “mno”,
7: “pqrs”,
8: “tuv”,
9: “wxyz”
2. 解题思路
核心思想:回溯
画出树形图(以输入digits=”23“为例):
----------------------for循环,横向遍历-------------------->
| 数字 2 对应的集合[abc]中取字母
| / | \
| 取字母a 取字母b 取字母c
| / | \
|数字3对应的集合[def]中取字母 集合[def]中取字母 集合[def]中取字母
| / | \ / | \ / | \
递归, 取d 取e 取f 取d 取e 取f 取d 取e 取f
纵向
遍历 / | \ / | \ / | \
|
| [ad] [ae] [af] [bd] [be] [bf] [cd] [ce] [cf]
|
|
v
⭐由上图可知:
①遍历的深度即输入字符串 digits 的长度
②所有叶子节点即最终的结果集
⭐需要定义那些全局变量?
①一个字符串数组 res,用来存放最终的结果集
②一个临时字符串 temp,暂存叶子节点的结果
⭐设计的回溯函数需要哪些参数?
①题目给定的 String digits
②数字到对应字母集合的映射,可定义为一个String[ ] num2String
③记录当前遍历到第几个数字的遍历num,也表示树的深度
⭐递归终止条件:
当前树的深度(即 num)等于输入字符串 digits 的长度
例如当前输入 digits 为"23",则需要从根节点向下递归两层即可。
3. 代码实现
class Solution {// res 存放最终组合结果List<String> res = new ArrayList<>();public List<String> letterCombinations(String digits) {// 判空// 如果 digits 为 null,则 digits.length() 就会报空指针异常。所以这里先判断是否为空,再调用函数if (digits == null || digits.length() == 0){return res;}// 建立 数字 ---> 字母集合 的映射,数组下标直接对应数字 2 ~ 9String[] num2String = {"", "", "abc", "def", "ghi", "jkl", "mno", pqrs, "tuv", "wxyz"};// 迭代backTracking(digits, num2String, 0);return res;}// 由于每次迭代都会获取一个字符串,选择可变且更为高效的StringBuilder类StringBuilder tmp = new StringBuilder();// 参数 String digits:输入的字符串,例如'23'// 参数 String[] num2String:数字 ---> 字母集合的映射// 参数 num:树的深度,也表示输入的 digits 中包含的数字的个数,记录当前遍历到第几个数字 private void backTracking(String digits, String[] num2String, int num){// 递归终止条件:num 等于输入的数字个数if (num == digits.length()){res.add(temp.toString());return;}// str 记录当前遍历的数字对应的字母集合// 例如:若 digits = '23', num = 0// 则 str 表示输入字符串 digits 的第一个字符'2'所对应的字母集合"abc"// digits.charAt(num)得到一个字符,该字符与字符'0'相减,实际上是是两个字符的ASCII码相减,返回就是intString str = num2String[digits.charAt(num) - '0'];// 遍历 str 所表示的字母集合for (int i = 0; i < str.length(); i++) {temp.append(str.charAt(i));// 递归,将 num 改为num + 1,即处理下一个数字backTracking(digits, num2String, num + 1);// 回溯,删除末尾字符,继续尝试temp.deleteCharAt(temp.length - 1)}}
}
再写一种实现:
class Solution {// 映射:数字 ---> 号码private String[] num2LetterSet = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};// 路径private StringBuilder path = new StringBuilder();// 结果集private List<String> res = new ArrayList<>();public List<String> letterCombinations(String digits) {if(digits == null || digits.length() == 0) {return res;}backTracking(digits,0);return res;}// 回溯函数private void backTracking(String digits, int index) {if(path.length() == digits.length()) {res.add(path.toString());return;}// 当前数字对应的字母集合String letterSet = num2LetterSet[digits.charAt(index)-'2'];// 将字符串形式的字母集合转为字符数组并遍历for(char ch: letterSet.toCharArray()) {path.append(ch);backTracking(digits, index + 1);path.deleteCharAt(path.length() - 1);}}
}
LeetCode刷题笔记:17.电话号码的字母组合相关推荐
- LeetCode刷题记录——17电话号码的字母组合
LeetCode刷题记录--17电话号码的字母组合 一 题目描述: 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下.注意1不对应任何字母 示例: 输入:&quo ...
- leecode做题笔记17————电话号码的字母组合
题目如下所示: 一开始的想法是通过循环遍历算法,但是每次循环的次数,由于每个数字包含的字母并不相同,所以会很麻烦.于是想到了使用递归的思想,但是由于本身递归算法使用的不够熟练,所以并没有写出成功的代码 ...
- LeetCode刷题笔记(算法思想 四)
LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...
- 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)
LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...
- LeetCode刷题笔记2——数组2
LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...
- 小何同学的leetcode刷题笔记 基础篇(01)整数反转
小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...
- LeetCode刷题笔记汇总
LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...
- 【leetcode刷题笔记】动态规划
#[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...
- LeetCode刷题笔记-动态规划-day4
文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
最新文章
- 满满干货的硬核技术沙龙,免费看直播还送书 | CSDN新书发布会
- 一条长度为l的笔直街道 java_如图,在一条笔直的东西向海岸线l上有一长为1.5km的码头MN和灯塔C,灯塔C距...
- [转]为什么程序员总是写糟糕的代码?这3个原因
- Verilog设计实例(7)基于Verilog的数字电子钟设计
- FlashDevelop调试Air出错
- 计算机合并键功能,Word组合(功能键与Ctrl等组合) -电脑资料
- 【ARM】Tiny4412裸板编程之Chip ID
- pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测
- QQ空间自动点赞脚本1
- 文件同步工具Unison
- linux查看pbs报错日志,PBS 作业管理系统
- 网站关键词密度多少会比较合适?
- 海归首选“北上广” 薪资期望不太高 元芳你怎么看?
- 如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍
- IN指令和OUT指令
- 高端游戏开发工具:Unity Pro 2019 Mac版
- Ubuntu的音频播放器,视频播放器和其他应用程序选择与配置
- 博彦科技[前端开发面试题]
- 计算机组成原理多层次的存储器,计算机组成原理多层次的存储器答案.ppt
- Redis——性能问题排查
热门文章
- 我与沙盘“没完没了”
- linux 怎么改系统字体,linux 修改系统默认字体
- 我家的网络、极路由和对小米路由器的期盼
- stm32407定义浮点数后进入硬件错误
- 通话蓝牙耳机什么牌子好?通话效果好的无线蓝牙耳机
- 生物JC UVSSA复合物缓解MYC驱动的转录压⼒ English
- 江苏二本讲师年入43万, 武汉985教授税前17万, 浙江省属讲师每月6K, 各省青椒晒工资!...
- 学弟学妹要的Java学习路线我终于写完了
- nodejs从实战到入门
- css教程:可读性可维护性良好的CSS文件