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.电话号码的字母组合相关推荐

  1. LeetCode刷题记录——17电话号码的字母组合

    LeetCode刷题记录--17电话号码的字母组合 一 题目描述: 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下.注意1不对应任何字母 示例: 输入:&quo ...

  2. leecode做题笔记17————电话号码的字母组合

    题目如下所示: 一开始的想法是通过循环遍历算法,但是每次循环的次数,由于每个数字包含的字母并不相同,所以会很麻烦.于是想到了使用递归的思想,但是由于本身递归算法使用的不够熟练,所以并没有写出成功的代码 ...

  3. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  4. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  5. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  6. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  7. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  8. 【leetcode刷题笔记】动态规划

    #[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...

  9. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  10. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

最新文章

  1. 满满干货的硬核技术沙龙,免费看直播还送书 | CSDN新书发布会
  2. 一条长度为l的笔直街道 java_如图,在一条笔直的东西向海岸线l上有一长为1.5km的码头MN和灯塔C,灯塔C距...
  3. [转]为什么程序员总是写糟糕的代码?这3个原因
  4. Verilog设计实例(7)基于Verilog的数字电子钟设计
  5. FlashDevelop调试Air出错
  6. 计算机合并键功能,Word组合(功能键与Ctrl等组合) -电脑资料
  7. 【ARM】Tiny4412裸板编程之Chip ID
  8. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测
  9. QQ空间自动点赞脚本1
  10. 文件同步工具Unison
  11. linux查看pbs报错日志,PBS 作业管理系统
  12. 网站关键词密度多少会比较合适?
  13. 海归首选“北上广” 薪资期望不太高 元芳你怎么看?
  14. 如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍
  15. IN指令和OUT指令
  16. 高端游戏开发工具:Unity Pro 2019 Mac版
  17. Ubuntu的音频播放器,视频播放器和其他应用程序选择与配置
  18. 博彦科技[前端开发面试题]
  19. 计算机组成原理多层次的存储器,计算机组成原理多层次的存储器答案.ppt
  20. Redis——性能问题排查

热门文章

  1. 我与沙盘“没完没了”
  2. linux 怎么改系统字体,linux 修改系统默认字体
  3. 我家的网络、极路由和对小米路由器的期盼
  4. stm32407定义浮点数后进入硬件错误
  5. 通话蓝牙耳机什么牌子好?通话效果好的无线蓝牙耳机
  6. 生物JC UVSSA复合物缓解MYC驱动的转录压⼒ English
  7. 江苏二本讲师年入43万, 武汉985教授税前17万, 浙江省属讲师每月6K, 各省青椒晒工资!...
  8. 学弟学妹要的Java学习路线我终于写完了
  9. nodejs从实战到入门
  10. css教程:可读性可维护性良好的CSS文件