leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人

前文回顾:

leetcode1. 两数之和--每天刷一道leetcode系列

leetcode2. 两数相加--每天刷一道leetcode系列!

leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!

leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!

leetcode5.最长回文子串--每天刷一道leetcode系列!

leetcode9. 回文数--每天刷一道leetcode系列!

leetcode11. 盛最多水的容器--每天刷一道leetcode系列!

leetcode14. 最长公共前缀--每天刷一道leetcode算法题系列!

leetcode15. 三数之和--每天刷一道leetcode算法系列!

leetcode16. 最接近的三数之和--每天刷一道leetcode算法系列!

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!_第1张图片
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

解析

对于输入23,如下图所示。

leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!_第2张图片
很显然这是一个组合问题,可能你会觉得着很简单,两层循环即可搞定,那么如果输入是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 res = new ArrayList();
    public List 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算法系列!)