概述
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人
前文回顾:
leetcode1. 两数之和--每天刷一道leetcode系列!
leetcode2. 两数相加--每天刷一道leetcode系列!
leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!
leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!
leetcode5.最长回文子串--每天刷一道leetcode系列!
leetcode9. 回文数--每天刷一道leetcode系列!
leetcode11. 盛最多水的容器--每天刷一道leetcode系列!
leetcode14. 最长公共前缀--每天刷一道leetcode算法题系列!
leetcode15. 三数之和--每天刷一道leetcode算法系列!
leetcode16. 最接近的三数之和--每天刷一道leetcode算法系列!
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解析
对于输入23,如下图所示。
很显然这是一个组合问题,可能你会觉得着很简单,两层循环即可搞定,那么如果输入是234呢,可能你会说3层循环就好了。但是如果是23456789,难道写个8层循环吗。这时候递归就派上用场了。
模仿循环的过程,我们将每次递归得到的结果记录在一个变量letter中。假设下一次递归遇到的字符为c,则letter=letter+c。
那么递归什么时候终止呢?我们还需要加一个变量index记录递归的层次,类似于循环到了哪一层。当index==digits.length()的时候,递归就应该终止了。
上面说的是递归的过程该是什么样子。本题中不仅有递归,还有一个循环。因为其实存在2-->abc, 3-->def,…..这样一个映射关系。我们可以将这种关系用一个数组telMap表示,telMap[2]就可以表示abc,telMap[3]就可以表示def。
代码
String[] telMap = {"_","!@#","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> res = new ArrayList<String>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0){
return res;
}
process(digits, "", 0);
return res;
}
private void process(String digits, String letter, int index){
//递归的第一步,确定终止条件,
if(index == digits.length()){
res.add(letter);
return;
}
String str = telMap[digits.charAt(index)-'0'];
for(int i = 0; i < str.length(); i++){
process(digits,letter+str.charAt(i),index+1);
}
}
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
最后
以上就是怕黑含羞草为你收集整理的leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!的全部内容,希望文章能够帮你解决leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复