欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode刷题笔记- 17. 电话号码的字母组合

程序员文章站 2022-03-14 22:53:03
...

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

输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

题解:
该题其实是一个二叉树的遍历问题:LeetCode刷题笔记- 17. 电话号码的字母组合
我们采用递归的方法,深度优先遍历即可,代码如下:

class Solution {
//这里采用了一种特殊方式初始化HashMap,第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),
//第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。
//这个块之所以被叫做“实例初始化块”是因为它们被定义在了一个类的实例范围内。
    Map<String,String> num_word=new HashMap<String,String>(){
        {
            put("2", "abc");
            put("3", "def");
            put("4", "ghi");
            put("5", "jkl");
            put("6", "mno");
            put("7", "pqrs");
            put("8", "tuv");
            put("9", "wxyz");
        }
    };
    List<String> result=new ArrayList<>();
    public void DFS_Find(String now_letter,String remain_number){//now-letter是当前已经处理好数字对应的字母,remain_number是还未处理的数字串
        if(remain_number.length()==0) result.add(now_letter);//递归出口
        else{
            String number=remain_number.substring(0,1);//截取还未处理数字串的第一个数字作为接下来要处理的数字
            String letters=num_word.get(number);//将该数字可能对应的字母从HashMap中找出来
            for(int i=0;i<letters.length();i++){//将可能对应的字母一一截取出来,组合到now_letter后面作为新的now_letter,递归调用DFS_Find函数
                String letter_temp=letters.substring(i,i+1);
                DFS_Find(now_letter+letter_temp,remain_number.substring(1));
            }
        }
        
    }
    public List<String> letterCombinations(String digits) {
        //如果给出的数字串长度不为零则启动深度优先遍历
        if(digits.length()!=0) DFS_Find("",digits);
        return result;
    }
}

官方题解传送门

相关标签: LeetCode刷题笔记