【LeetCode-中等题】17. 电话号码的字母组合

文章目录

    • 题目
    • 方法一:递归+回溯

题目

【LeetCode-中等题】17. 电话号码的字母组合_第1张图片

方法一:递归+回溯

参考讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合
首先可以画出树图:
【LeetCode-中等题】17. 电话号码的字母组合_第2张图片

  • 先将数字对应的字符集合 加入到一个map集合

【LeetCode-中等题】17. 电话号码的字母组合_第3张图片

  • 这里需要一个index来控制取数的范围,例如"2 3" 第一次index ==0 代表取 数字2 并且根据2可以从map中取出 2 对应的字符串
  • 最终结果集在递归结束的时候收获,也就是要么 index 大于了数字字符串的长度 或者就是最后的要收获的子结果集长度等于数字字符串的长度
    在这里插入图片描述
    代码图示:
    【LeetCode-中等题】17. 电话号码的字母组合_第4张图片
class Solution {
    // 递归+回溯
    List<String> res = new ArrayList<>();//结果集
    Map<Character,String> map = null;//全局map
    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0) return res;
         map = new HashMap<>(){{//映射关系
            put('2', "abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }};
        StringBuffer str = new StringBuffer();//子结果集
        int index = 0 ; //用于控制取到哪个数字了 初始默认取0(第一个位置) 2     
        dfsback(digits,index,str);
        return res;
    }
    public void dfsback(String digits,int index,StringBuffer str){
        //  if(str.length() == digits.length()){//递归结束  收获结果      这两个递归终止条件都是可以的
           if(index > digits.length()){//递归结束  收获结果
             res.add(str.toString());
             return;
         }
         String s = map.get(digits.charAt(index));  //取出index位置的数字  并且根据数字获取到对应的字符串
         for(int i = 0 ;i<s.length()  ; i++){
             str.append(s.charAt(i));//加入子结果集
             dfsback(digits,index+1,str);  //index+1  让下一次递归  到下一个数字去取
             str.deleteCharAt(str.length() - 1);//回溯删掉字符串最后一个字符
         }
     }
}

你可能感兴趣的:(力扣,#,中等题,leetcode,linux,windows)