代码随想录-2023/07/23

76 阅读1分钟

回溯模块

216.组合总和III

解题思路: 回溯法, 递归路径上求和, 判断和是否等于n, 另外需要传入索引, 对当前节点去重

代码:

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    LinkedList<Integer> list = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        backtracking(k, n, 0, 1);
        return ans;
    }

    public void backtracking(int k, int n, int sum, int start) {
        if(list.size() == k){
            if(sum == n){
                ans.add(new ArrayList<>(list));
            }
            return;
        }

        for(int i=start; i<=9; i++){
            list.add(i);
            backtracking(k, n, sum + i, i+1);
            list.removeLast();
        }
    }
}

17.电话号码的字母组合

解题思路:

  1. 回溯法(将每个数字字符视作一层, 然后对于数字字符对应的字母进行横向遍历)
  2. 在路径上对遍历的字符串进行累加, 然后判断长度是否等于原字符串长度, 相等则加入集合

代码:

class Solution {
    List<String> ans = new ArrayList<>();
    HashMap<Integer, String> map = new HashMap<>();
    public List<String> letterCombinations(String digits) {
        if(digits.length() < 1) return ans;
        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");
        backtracking(digits, "", 0);
        return ans;
    }

    public void backtracking(String digits, String path, int start){

        if(path.length() == digits.length()){
            ans.add(path);
            return;
        }

        char[] ch = map.get(digits.charAt(start)-'0').toCharArray();
        for(int i=0; i<ch.length; i++){
            backtracking(digits, path+ch[i], start+1);
        }
    }
}