leetcode之回溯backtracing专题3

17 Letter Combinations of a Phone Number

 手机上每个数字按钮旁边都有3-4个字母,输入数字字符串,输出可能的字母组合。
 例如输入:”23”
 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
 思路:建立每个数字和对应字母的映射关系。该个处理每一位数字,遍历每个数字可能的取值。按照递归去实现很简单。
 

private  List<String> result = new ArrayList<String>();
private static Map<Integer, List<Character>> numberMap = new HashMap<Integer, List<Character>>();
static{for(int i=2;i<7;i++){numberMap.put(i, new ArrayList<Character>());for (int j = 0; j < 3; j++) {char ch = (char) ('a' + 3 * (i - 2) + j);numberMap.get(i).add(ch);}}numberMap.put(7, new ArrayList<Character>());numberMap.get(7).add('p');numberMap.get(7).add('q');numberMap.get(7).add('r');numberMap.get(7).add('s');numberMap.put(8, new ArrayList<Character>());numberMap.get(8).add('t');numberMap.get(8).add('u');numberMap.get(8).add('v');numberMap.put(9, new ArrayList<Character>());numberMap.get(9).add('w');numberMap.get(9).add('x');numberMap.get(9).add('y');numberMap.get(9).add('z');}
public List<String> letterCombinations(String digits) {result.clear();StringBuilder str = new StringBuilder(digits.length());str.setLength(digits.length());if(digits.length()>0){robot(0, digits, str);}return result;
}private void robot(int idx, String digits, StringBuilder r) {if (idx >= digits.length()) {result.add(r.toString());return;}int n = digits.charAt(idx) - 48;if (n < 2)return;for(char ch : numberMap.get(n)){r.setCharAt(idx, ch);robot(idx + 1, digits, r);}
}

收获1

 嗯代码够丑的。看别人怎么处理映射关系。我怎么没想到呢。之前也有这样一个例子,当数字作为map的key的时候,选择用数组代替map,可能会是一种比较优雅的方式。
 

String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

收获2

 一次性给stringBuider 一定的长度。这个做法在字符串中还是有点变扭。这个想法是从数组那里继承过来的。可以使用字符串相加的方式。
 

private static final String[] KEYS = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
private List<String> result = new ArrayList<String>();public List<String> letterCombinations(String digits) {result.clear();robot(0, digits, "");return result;
}private void robot(int idx, String digits, String prefix) {if (idx >= digits.length()) {if (prefix.length() > 0) {result.add(prefix);}return;}int n = digits.charAt(idx) - 48;if (n < 2)return;String letters = KEYS[n];for (int i = 0; i < letters.length(); i++) {robot(idx + 1, digits, prefix + letters.charAt(i));}
}

收获3

 我是没法用递推的方式实现的,只能用递归。看看别人怎么做。其实从上一个递归的代码是可以得到一些启示的。当然这是“马后炮”的想法–看到别人这么做觉得应该想到的。但是之前我一直在用for去思考。
 

public List<String> letterCombinations(String digits) {LinkedList<String> ans = new LinkedList<String>();String[] mapping = new String[] { "0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };ans.add("");for (int i = 0; i < digits.length(); i++) {int x = Character.getNumericValue(digits.charAt(i));while (ans.peek().length() == i) {String t = ans.remove();for (char s : mapping[x].toCharArray())ans.add(t + s);}}return ans;}

参考链接
1 链接1 
2 链接2

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

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

相关文章

第二十一期:拜托!面试不要再问我Spring Cloud底层原理

毫无疑问&#xff0c;Spring Cloud 是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面&#xff0c;其底层的很多原理&#xff0c;很多人可能并不知晓。 因此本文将通过大量的手绘图&#xff0c…

springBoot修改代码不需要重启-热部署

springboot每次修改代码都需要重启项目&#xff0c;进行热部署后就不需要每次修改代码都要重启项目了 热部署&#xff1a; 需要在pom.xml里进行配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools&…

[Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

【问题描述】[中等] 【解答思路】 其实就是深拷贝的一个实现&#xff0c;深拷贝就是对于所有的指针成员&#xff0c;不能仅仅是赋值&#xff0c;还有重新分配空间。 深拷贝反应在本题中就是&#xff0c;所有的结点需要重新new出来&#xff0c;而不是直接赋值。 整体的思路依然…

阅读目录(置顶)(长期科技领域知识)

第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高&#xff0c;发展前景更好&#xff1f; 第五期:干货总结&#xff1a;中级前端工程师必须要掌握的27个JavaScript 技巧 第六期…

leetcode之回溯backtracing专题4

131 Palindrome Partitioning 输入一个字符串s&#xff0c;将s分割为n个子串&#xff0c;每个子串都是一个回文。返回s有多少种分割方式。  例如输入&#xff1a;“aab”  输出&#xff1a;[ [“aa”,”b”], [“a”,”a”,”b”] ]  思路&#xff1a;这是一个不断将问…

[Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

【问题描述】[简单] 【解答思路】 千万不要想复杂了 不是三维空间 是一维空间 &#xff01; 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是&#xff1a;直接或间接相邻的同色方格构成的整体。 可以发现&#xff0c;「色块」就是被不同颜色的方…

第六章 参数估计(续)

区间估计 问题&#xff1a;点估计估计的参数有多大概率是正确的&#xff1f;用区间估计来表示。 置信区间 设总体X的分布函数F(x;θ)&#xff0c;θ未知&#xff0c;对给定值α(0<α<1)&#xff0c;有两个统计量θ^Lθ^L(X1,X2,...Xn),θ^Uθ^U(X1,X2,...Xn)&#xff0c…

第六十八期:程序员与医生

8月25日 以下文章来源于崖边小生 &#xff0c;作者道友留步 程序员与医生 久病未能成医&#xff0c;然而却悟出了程序员与医生的道理。细想来&#xff0c;程序员和医生这个职业竟如此相似。 职业的诞生 上帝创造了人类&#xff0c;而人类又创造了程序。上帝所创造的人类并…

【数据结构与算法】计数、基数、桶 O(n) 不基于比较

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 桶排序–>分区间桶快速排序&#xff08;归并排序&#xff08;稳定性&#xff09;&#xff09;–>取出结果 计数排序&#xff08;特殊的桶排序&#xff09;–>分单个桶…

java核心-多线程-Java多线程编程涉及到包、类

Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包&#xff0c;主要是线程基础类 <1>Thread<2>Runnable<3>ThreadLocal java.util包&#xff0c;主要是线程基础类和并发工具类 <1>基础线程类Callable、Futu…

第六十九期:【学习分享】温水里的程序员,技术将成为温水

张泰峰 7月7日 七月&#xff0c;炎炎的夏日&#xff0c;疯狂的暴雨不分昼夜&#xff0c;侵袭着这座城。早上七点&#xff0c;我骑着摩拜单车出发去往地铁站&#xff0c;誓死如归一般的&#xff0c;挤进地铁。像往常一样&#xff0c;骑车、挤地铁、打卡上班。 相信大家都跟我一…

第七章 假设检验

假设检验的目的是通过收集到的数据&#xff0c;来验证某个想要得到的结论。 假设检验的思想是&#xff1a;小概率反证法思想。 显著性检验是本章的主要内容。下面从实际例子来通俗的理解一下显著性检验。 显著性检验中有几个概念不太好理解。 嫌犯X是否有罪 有这样一个事件…

第七十期:IT技术人员的自我修养

8月4日 以下文章来源于空山新雨的技术空间 &#xff0c;作者空山新雨的技术空间 前言 在IT领域摸爬滚打多年&#xff0c;从一个普通程序员到技术主管&#xff0c;到技术经理&#xff0c;再到技术总监&#xff0c;踩过不少坑、加过不少班&#xff0c;也背过不少锅。 在提升自…

NOI2004郁闷的出纳员

传送门 题目看起来玄乎,但其实只需要一点点小 trick 就可以了. 我们可以用一个全局的 delta 来维护工资的调整记录 对于每一个新加入的员工,先判断是否低于最低工资下限,如果是,直接踢出,不做任何操作,否则,将其插入 Treap 中,不过这时为了不对以后的查询产生影响,我们要插入的…

【数据结构与算法】排序优化

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 总结&#xff1a;如何实现一个通用的高性能的排序函数&#xff1f; 一、如何选择合适的排序算法&#xff1f; 1.排序算法一览表 时间复杂度是稳定排序&#xff1f;是原地排…

第七章 假设检验(2)

接上文。 正态总体均值、方差的假设检验 单个正态总体均值的假设检验、方差的假设检验&#xff1b;成对数据均值的假设检验、两个正态总体方差比的检验。根据检验统计量的分布分别称为:z检验、t检验、卡方检验、F检验。 分布原假设H0检验统计量备择假设H1拒绝域单正态(σ2已知…

第二十二期:动画讲解TCP,再不懂请来打我

TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官的青睐。 前言 TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官…

【数据结构与算法】二分查找

一、什么是二分查找&#xff1f; 二分查找针对的是一个有序的数据集合&#xff0c;每次通过跟区间中间的元素对比&#xff0c;将待查找的区间缩小为之前的一半&#xff0c;直到找到要查找的元素&#xff0c;或者区间缩小为0。 二、时间复杂度分析&#xff1f; 1.时间复杂度 …

第七章 假设检验(3)

关于样本量n的取值 如果希望在控制第I类错误的情况下&#xff0c;同时限制第II类错误的&#xff0c;这个时候就需要考虑样本量。样本量越大&#xff0c;错误概率越低。使用OC曲线。 分布拟合检验 如果不知道总体服从什么类型的分布&#xff0c;就需要根据样本来检验分布的假设…

git 多用户多仓库配置

ssh全称是Secure Shell&#xff0c;即安全Shell&#xff0c;是一种可以进行安全远程登录的协议&#xff0c;在Linux中以OpenSSH为代表&#xff0c;Windows中则有Putty作为实现。ssh的会话建立阶段类似TCP协议的三次握手&#xff0c;里面涉及到利用非对称加密(RSA/DSA)和密码协商…