Leetcode 17. 电话号码的字母组合

113 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

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

二、思路分析

  • 这道题是一个排列组合的问题,会用到回溯的思想!
    • 首先我们把数字字符串分割
    • 分别找到他们所对应的字母字符串,依次进行枚举,并用StringBuilder进行拼接
    • 达到数字的长度后将结果存储起来
    • 存储后,需要将StringBuilder回退,重新进行上两步

三、AC 代码:

class Solution {
    //存储数字对应的字符串
    Map<Character, String> phoneMap = new HashMap<>();

    public List<String> letterCombinations(String digits) {
        //返回的结果集合
        List<String> combinations = new ArrayList<>();
        //边界条件,长度为0直接返回
        if(digits.length() == 0){
            return combinations;
        }

        phoneMap.put('2', "abc");
        phoneMap.put('3', "def");
        phoneMap.put('4', "ghi");
        phoneMap.put('5', "jkl");
        phoneMap.put('6', "mno");
        phoneMap.put('7', "pqrs");
        phoneMap.put('8', "tuv");
        phoneMap.put('9', "wxyz");
        //回溯参数分别为数字字符串的长度、结果集合、map对应关系、从零开始、临时的存储
        backtrack(digits, combinations, phoneMap, 0, new StringBuilder());
        return combinations;
    }

    private void backtrack(String digits, List<String> combinations, Map<Character, String>phoneMap, int index, StringBuilder combination){
        //长度相等,添加到结果集合中
        if(index == digits.length()){
            combinations.add(combination.toString());
            return ;
        }
        //拿到数字
        char digit = digits.charAt(index);
        //取出数字对应的字母
        String letter = phoneMap.get(digit);
        //字母的长度
        int letterLength = letter.length();

        for(int i = 0; i < letterLength; i++){
            //临时存储
            combination.append(letter.charAt(i));
            //回溯枚举
            backtrack(digits,combinations,phoneMap,index + 1, combination);
            //临时存储还原
            combination.deleteCharAt(index);
        }
    }
}


四、总结:

  • 好了,代码撸完,我们总结一下
    • 这道题运用了回溯的思想

    • 细节,要注意回溯方法的参数

    • 回溯之后记得还原

    • 回溯和递归有点相似,不太好理解,小朋友们,可以画画图,或者DEBUG一下

最后这个算法是Leetcode的第17题,是热题100的第9题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点赞关注,如果你也在刷热题100的话,希望可以对你有一些启发!