17. 电话号码的字母组合

175 阅读1分钟

题目介绍

力扣17题:leetcode-cn.com/problems/le…

image.png

image.png

分析

关于这种组合排列的题目,我们肯定能够直接想到使用回溯算法来解决,参考[回溯算法框架总结],回溯算法的代码框架都是通用的,无非就是稍微修改以下,代码框架如下:

result = []
public void backtrack(路径, 选择列表) {
    if 满足结束条件:
        result.add(路径)
        return

    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择
}

所以本题也类似,由于每个数字上面都有对应的字母【除了数字1】,我们可以使用HashMap结构存储数字跟字母的对应关系。代码如下:

class Solution {
    //初始化HashMap,存储数字跟字母的对应关系
    HashMap<Character, String> numberMap = 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");
        }
    };

    public List<String> letterCombinations(String digits) {
        List<String> result = new ArrayList<>();
        StringBuffer solution = new StringBuffer();
        if("".equals(digits)) {
            return result;
        }
        backTrack(digits, result, solution, 0);
        return result;
    }

    public void backTrack(String digits, List<String> result, StringBuffer solution, int i) {
        int n=digits.length();
        //结束条件
        if(i >= n){
            result.add(solution.toString());
            return;
        }
        //获取数字
        char digit = digits.charAt(i);
        //根据数字获取到对应的字母
        String letters = numberMap.get(digit);
        for(int j = 0; j < letters.length(); j++){
            //做选择
            solution.append(letters.charAt(j));
            //递归
            backTrack(digits,result,solution,i+1);
            //回溯
            solution.deleteCharAt(i);
        }
    }
}