Leetcode 17 Letter Combinations of a Phone Number 笔记

237 阅读1分钟

Medium

思路

  • 找所有的可能性,想到DFS
  • 画出recursion tree
  • 几层level
  • 每个level的意义
  • 两个level,分别代表2和3
  • 时间复杂度 = O(branch factor ^ depth) < O(4^n)
  • 空间复杂度 = DFS call了多少次 -> O(n)

过程

  • 定义Map,把数字和字母的对应关系放进去
  • 定义StringBuilder用来存贮结果,每加一个sb后面就续一位,最后用sb.toString()变回String
  • dfs过程
  • Base case: 任务只有一个: 确定触底条件, 调整结果,而后向上层返回
  • base case : index等于给的数字长度, 说明触底, 结果sb添加新字符
  • sub - question : 确定数字,找到对应map里的value
  • for循环value String里的每个字符,每加完一个字符后,就进行下一次dfs并更改index状态。因为每个level我们只能添加一个字符
  • 记得recover
  • 在DFS递归中传递加减不要用++, ——

代码

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> res = new ArrayList<>();
        if(digits.length() == 0) return res;
        
        Map<Character, String> map = new HashMap<>();
        map.put('1', "");
        map.put('2', "abc");
        map.put('3', "def");
        map.put('4', "ghi");
        map.put('5', "jkl");
        map.put('6', "mno");
        map.put('7', "pqrs");
        map.put('8', "tuv");
        map.put('9', "wxyz");
        map.put('0', "");
        
        StringBuilder sb = new StringBuilder();
        dfs(digits, map, 0, sb, res);
        return res;
    }
    
    private void dfs(String digits, Map<Character, String> map, int index, StringBuilder sb, List<String> res){
        if(index == digits.length()){
            res.add(sb.toString());
            return;
        }
        char ch = digits.charAt(index);
        System.out.print(ch);
        String str = map.get(ch);
        System.out.print(str);
        for(char c : str.toCharArray()){
            sb.append(c);
            dfs(digits, map, index + 1, sb, res);
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}