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

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

思路

其实就是将其类比与树,对树进行遍历,如下图所示
在这里插入图片描述
思路流程:

  1. 将每一种数字对应的字符串使用map集合保存
  2. 使用递归,将数字(key)对应的字符串(value)里面的字符使用charAt()方法进行获取
  3. 使用StringBuffer进行拼接字符串

代码

class Solution {
    public List<String> letterCombinations(String digits) {
        //定义存放所求字符串的集合,用于函数返回
        List<String> combinations = new ArrayList<String>();
        //如果数组的长度是0,则直接返回空的集合
        if(digits.length()==0){
            return combinations;
        }
        //使用map存放2到9的字母情况
        Map<Character, String> phoneMap = new HashMap<Character, 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");
        }};
        //回溯函数
        backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
        return combinations;
    }
    /*
        combinations:存放的所有符合要求的组合
        phoneMap:2到9的所有字符情况
        digits:按键情况
        index:当前所在位置(比如“23”,等于0变代表当前是“2”的情况)
        combination:拼接要求的组合
    */
    public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination){
        //当当前所在的位置等于输入的按键的字符的长度时,证明已经遍历到底
        if(index==digits.length()){
            combinations.add(combination.toString());
        }else{//还可以进行向下一个字符走
            //获取当前位置的内容(如“23”,index=0,获取字符“2”)
            char digit = digits.charAt(index);
            //获取当前字符的字符串情况(如“23”,index=0时,字符为“2”,,获取的字符串为“abc”)
            String letters = phoneMap.get(digit);
            //获取字符串长度,进行遍历,拼接
            int lettersCount = letters.length();
            //遍历所有情况,进行拼接字符
            for(int i=0;i<lettersCount;i++){
                //将当前位置的字符拼接到所要加入集合的字符串后面
                combination.append(letters.charAt(i));
                //进行递归,获取下一种情况
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                //删除索引为index的字符
                //因为现在的combination里面包含了后面的一个字符,所以需要删除
                combination.deleteCharAt(index);
            }
        }
    }
}

代码说明

看注释。。。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值