[LeetCode] 17. 电话号码的字母组合
时间:2019-09-22
本文章向大家介绍[LeetCode] 17. 电话号码的字母组合,主要包括[LeetCode] 17. 电话号码的字母组合使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
说明:
- 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
示例 :
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
分析
一、迭代
判断字符串是否为空,为空直接返回,否则加入一个空字符串
List<String> res = new ArrayList<>(); if (digits.isEmpty()) { return res; } res.add("");
建表,保存每个数字代表的字符串
String[] table = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
遍历数字字符串 digits 时创建一个临时的字符串数组 temp ,通过数字取出字符串,然后遍历取出的字符串中的所有字符,再遍历当前 res 中的每一个字符串,将字符加到字符串后面,并加入到临时字符串数组 temp 中,两重遍历完成后,更新 res 为 temp ;(看不懂文字直接看代码,代码容易看懂)
for (char num : digits.toCharArray()) { List<String> temp = new ArrayList<>(); for (char tail : table[num - '0'].toCharArray()) { for (String pre : res) { temp.add(pre + tail); } } res = temp; }
二、回溯
判空、建表与上述一致
递归函数写法,使用 s 记录当前的字符串,level 记录当前的字符串字符个数;
每次递归先判断 level ,当 level 等于 digits 长度时,将字符串s加入结果数组 res ;
否则通过 digits 中的数字取出字符串,然后遍历这个取出的字符串,将每个字符都加到当前的组合后面,并调用递归函数。
public void backtracking(String digits, String s, int level) { if (level == digits.length()) { res.add(s); return; } for (char tail : table[digits.charAt(level) - '0'].toCharArray()) { backtracking(digits, s + tail, level + 1); } }
调用递归函数时,传入 s 为空字符串"",level 为0;
public List<String> letterCombinations(String digits) { if (digits.isEmpty()) { return res; } backtracking(digits, "", 0); return res; }
三、队列
判空、建表与上述一致
思想类似第一种迭代,但利用了队列的先进先出,不用每次创建临时的数组
for (int i = 0; i < digits.length(); i++) { // 把数字字符转为数字 int num = Character.getNumericValue(digits.charAt(i)); // 利用了当前保存的结果字符串长度与当前遍历的数字下标相等的条件进行判断 while (res.peek().length() == i) { String s = res.poll(); for (char tail : table[num].toCharArray()) { res.offer(s + tail); } } }
代码
解法一:迭代
class Solution { public List<String> letterCombinations(String digits) { List<String> res = new ArrayList<>(); if (digits.isEmpty()) { return res; } res.add(""); String[] table = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; for (char num : digits.toCharArray()) { List<String> temp = new ArrayList<>(); for (char tail : table[num - '0'].toCharArray()) { for (String pre : res) { temp.add(pre + tail); } } res = temp; } return res; } }
解法二:回溯
class Solution { List<String> res = new ArrayList<>(); String[] table = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; public List<String> letterCombinations(String digits) { if (digits.isEmpty()) { return res; } backtracking(digits, "", 0); return res; } public void backtracking(String digits, String s, int level) { if (level == digits.length()) { res.add(s); return; } for (char tail : table[digits.charAt(level) - '0'].toCharArray()) { backtracking(digits, s + tail, level + 1); } } }
解法三:队列
public List<String> letterCombinations(String digits) { LinkedList<String> res = new LinkedList<>(); String[] table = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; if (digits.isEmpty()) { return res; } res.add(""); for (int i = 0; i < digits.length(); i++) { // 把数字字符转为数字 int num = Character.getNumericValue(digits.charAt(i)); // 利用了当前保存的结果字符串长度与当前遍历的数字下标相等的条件进行判断 while (res.peek().length() == i) { String s = res.poll(); for (char tail : table[num].toCharArray()) { res.offer(s + tail); } } } return res; }
小结
Character.getNumericValue(char ch)
该方法获取参数ch的数值,有三种返回值
- 若ch字符的数值为非负整数,返回ch字符对应的数值
- 若为不是非负整数,返回-2
- 若字符没有数值,返回-1
原文地址:https://www.cnblogs.com/qiu_jiaqi/p/LeetCode_17.html
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
- 每天一个Linux命令(4)——mkdir
- 每天一个Linux命令(3)——pwd
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- Fiddler抓包7-post请求(json)
- Selenium2+python自动化56-unittest之断言(assert)
- 长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)
- 回归与梯度下降法及实现原理
- 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring 声明式事务
- Leetcode 1320 二指输入的的最小距离(多情况讨论,DP)
- Spring 基本注解
- Spring 基于注解的 IOC 与 AOP
- Leetcode 1319 连通网络的操作次数(并查集)
- Leetcode 77. 组合 (排列组合,回溯)
- C++17特性 string_view substr只要常数复杂度,且省内存
- MQ 系列之 ActiveMQ 基本使用
- 使用脚本定时备份 MySQL 数据库
- 解决数独问题用人工智能还是量子计算?
- Leetcode 39. 组合总和(dfs)
- 短视频APP制作,设置高斯模糊
- 使用 Sunny-Ngrok 将内网程序发布到外网
- Leetcode 17. 电话号码的字母组合 (dfs)
- Java实现md5和base64加密解密的示例代码