电话号码的字母组合---2022/01/23
题目来源
题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射与电话按键相同。注意 1 不对应任何字母。
思路:
暴力法:多少个数字就多少个循环,循环长度为对应字符数组的长度
如果取最大长度为4,那么循环为o(n^4)。
前提---先建立对应关系数组;
结构---由i遍历所有字符。字符转化成数字对应的字符串进行组合;
判断---循环数字对应的字符串字符,然后进行组合。(拎一个出来做基准)
组合的原则是每个数字都要从对应的字符串中提供一个字符。
长度为3的字符串可以贡献3个字符,长度为4的字符串可以贡献4个字符,
如何衡量这个贡献度呢,判断长度;
收获:
1---set与list的区别。set无重复对象,list可重复对象。
2---如何取出list元素的值并进行修改?修改list中下标为index对象的值:set(index, element)增添:add(index, element)
3---如果考虑异常输入的情形,单个字符判断其合法性。
4---每次迭代获取一个字符串,所以会设计大量的字符串拼接,考虑选择更为高效的 StringBuildStringBuilder temp = new StringBuilder();temp.append(str.charAt(i));list.add(temp.toString());
5---使用暴力法时注意做回退。
以下为Java代码实现:
class Solution {public List<String> letterCombinations(String digits) {List <String> list=new ArrayList<>();//考虑输入为空的情况if(digits.length()==0||digits==null){return list;}String[] trans= {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};if(digits.length()==1){int index=Integer.valueOf(digits);for(int i=0;i<trans[index].length();i++){list.add(String.valueOf(trans[index].charAt(i)));}return list;}if(digits.length()==2){char [] ch_temp=digits.toCharArray();int index=ch_temp[0]-'0';for(int i=0;i<trans[index].length();i++){StringBuilder temp = new StringBuilder();temp.append(trans[index].charAt(i));int index1=ch_temp[1]-'0';for(int j=0;j<trans[index1].length();j++){temp.append(trans[index1].charAt(j));list.add(temp.toString());temp.deleteCharAt(temp.length()-1);}}return list;}if(digits.length()==3){char [] ch_temp=digits.toCharArray();int index=ch_temp[0]-'0';for(int i=0;i<trans[index].length();i++){StringBuilder temp = new StringBuilder();temp.append(trans[index].charAt(i));int index1=ch_temp[1]-'0';for(int j=0;j<trans[index1].length();j++){temp.append(trans[index1].charAt(j));int index2=ch_temp[2]-'0';for(int k=0;k<trans[index2].length();k++){temp.append(trans[index2].charAt(k));list.add(temp.toString());temp.deleteCharAt(temp.length()-1);}temp.deleteCharAt(temp.length()-1);}}return list;}if(digits.length()==4){char [] ch_temp=digits.toCharArray();int index=ch_temp[0]-'0';for(int i=0;i<trans[index].length();i++){StringBuilder temp = new StringBuilder();temp.append(trans[index].charAt(i));int index1=ch_temp[1]-'0';for(int j=0;j<trans[index1].length();j++){temp.append(trans[index1].charAt(j));int index2=ch_temp[2]-'0';for(int k=0;k<trans[index2].length();k++){temp.append(trans[index2].charAt(k));int index3=ch_temp[3]-'0';for(int kk=0;kk<trans[index3].length();kk++){temp.append(trans[index3].charAt(kk));list.add(temp.toString());temp.deleteCharAt(temp.length()-1);}temp.deleteCharAt(temp.length()-1);}temp.deleteCharAt(temp.length()-1);}}return list;}return list;}
}
暴力无敌。
提升:前面的思路实际上是暴力实现的过程。
实际上这道题的核心应该是利用递归+回溯来处理。
等理清楚递归+回溯这个知识点再做补充。
路漫漫其修远兮。
电话号码的字母组合---2022/01/23相关推荐
- 2022.01.23【读书笔记】丨生物信息学与功能基因组学(第六章 多重序列比对 上)
学习目标 理解使用ClustalW进行多重序列比对(MSA)的三个主要阶段: 描述几种其他的多重序列比对(MSA)程序,了解他们的工作原理,比对它们与ClustalW的异同: 理解进行基准研究的重要性 ...
- 《安富莱嵌入式周报》第249期:2022.01.17--2022.01.23
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- 《LeetCode力扣练习》第17题 电话号码的字母组合 Java
<LeetCode力扣练习>第17题 电话号码的字母组合 Java 一.资源 题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数 ...
- LeetCode 17电话号码的字母组合(搜索)18四数之和
电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23 ...
- 【LeetCode】【HOT】17. 电话号码的字母组合(递归)
[LeetCode][HOT]17. 电话号码的字母组合 文章目录 [LeetCode][HOT]17. 电话号码的字母组合 package hot;import java.util.ArrayLis ...
- [DFS|回溯法] leetcode 17 电话号码的字母组合
[DFS|回溯法] leetcode 17 电话号码的字母组合 1.题目 题目链接 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...
- 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)
目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...
- leetcode17 电话号码的字母组合,39 组合总和(python)
文章目录 17. 电话号码的字母组合 分析 代码 通过截图 39. 组合总和 分析 代码 通过截图 代码 通过截图 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的 ...
- day21|216.组合总和III、17.电话号码的字母组合
216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回所有可能的有效组合的列表 .该列表不能包含相同的组合两次,组合可以以 ...
- Day25|组合板子|216. 组合总和 III| 17. 电话号码的字母组合
组合板子+剪枝 216. 组合总和 III 剪枝操作? 17. 电话号码的字母组合 216. 组合总和 III class Solution {private:vector<int>tem ...
最新文章
- 一口气说出 5 种 IO 模型,蒙圈了!
- PowerDesigner165安装婆姐汉花教程
- C#200个基础工具类,史上最全快收藏下载
- mysql事务未提交读_mysql事务之未提交读Read uncommitted(仅学习)
- 机考可以作弊吗_法考主观题也全面机考?不慌,看这篇文章
- 大容量导入和导出数据 -- 格式化文件生成
- 一个前端的入行故事,零基础,2个月自学入门前端,半年从外包进淘宝
- sql server 内存_SQL Server内存性能指标–第6部分–其他内存指标
- 电视动态测试软件,[4K演示] 你的电视能顶得住吗?精神污染MAX的SONY4K动态测试......
- standard fifo和fwft fifo的区别
- Linux Minit Xshell5连接虚拟机Minit
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
- Scroller全认知,对于Scroller 你真的了解吗?
- file_operations结构体介绍
- linux 内存映射-ioremap和mmap函数
- 永洪bi日志清理配置
- SOS:硬盘数据丢失怎么办?
- 2021-06-09
- 老板无偿征用你的朋友圈,你愿意吗?
- 霍纳法则(Horner‘s rule)