【LeetCode】17. 电话号码的字母组合(回溯)

题目链接

17. 电话号码的字母组合

题目描述

解题思路

又是一题经典的回溯,连续2天LC题目都是利用回溯进行解决。

  • 打印字符串全部子序列Leetcode491递增子序列不同的是,本题需要利用一个hashmap去记录各个数字与字符串的映射关系。
  • 还需要注意的一个点是:如果题目给出“234”,那输出的字母组合的长度必须等于“234”.length(),也就是不能输出“ad",必须输出”adg"长度为3的字符串,所以递归的条件需要变化。

AC代码

class Solution {
    Map<Character,String> mp = new HashMap<>();
    List<String> ans = new LinkedList<>();
    StringBuffer sb = new StringBuffer();
    
    void dfs(int len,String digits,Map<Character,String> mp){
        
        //递归的出口是len==digits.length(),len可以理解为深度。
        //因为我们需要的答案正是当len==digits.length()完成的,所以我们必须先把答案添加到ans动态数组中才可以结束本次递归。
        if(sb.length()==digits.length()) ans.add(sb.toString());
        if(len == digits.length()) return;
        //因为每一层都有多个选择,所以需要一个for循环,
        //如果是二叉树的话,就只有一个节点,所以不需要for循环直接递归即可
        for(int i = 0; i < mp.get(digits.charAt(len)).length(); i++){
            sb.append(mp.get(digits.charAt(len)).charAt(i));
            dfs(len+1,digits,mp);
            sb.deleteCharAt(sb.length()-1);//这句话最能体现出回溯的思想!
        }
    }
    public List<String> letterCombinations(String digits) {
        mp.put('2',"abc");     
        mp.put('3',"def");  
        mp.put('4',"ghi");  
        mp.put('5',"jkl");  
        mp.put('6',"mno");  
        mp.put('7',"pqrs");  
        mp.put('8',"tuv");  
        mp.put('9',"wxyz");  
        if(digits.length() == 0) return ans;
        dfs(0,digits,mp);
        return ans;
    }
}
posted @ 2020-08-26 11:08  控球强迫症  阅读(155)  评论(0编辑  收藏  举报