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

题目

在这里插入图片描述

方法一:递归+回溯

参考讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合
首先可以画出树图:
在这里插入图片描述

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

在这里插入图片描述

  • 这里需要一个index来控制取数的范围,例如"2 3" 第一次index ==0 代表取 数字2 并且根据2可以从map中取出 2 对应的字符串
  • 最终结果集在递归结束的时候收获,也就是要么 index 大于了数字字符串的长度 或者就是最后的要收获的子结果集长度等于数字字符串的长度
    在这里插入图片描述
    代码图示:
    在这里插入图片描述
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);//回溯删掉字符串最后一个字符
         }
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值