回溯day3

40. 组合总和 II

class Solution {
    private List<List<Integer>> res;
    private LinkedList<Integer> path;
    private int sum;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        res = new ArrayList<>();
        path = new LinkedList<>();
        sum = 0;
        //排序,让相同元素能够排在一起
        Arrays.sort(candidates);
        backtracking(candidates, target, 0);
        return res;
    }
    private void backtracking(int[] candidates, int target, int s) {
        if (sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = s; i < candidates.length && sum + candidates[i] <= target; i++) {
            //不同树枝相同层相同元素剪枝
            if (i > s && candidates[i] == candidates[i - 1]) {
                continue;
            }
            path.add(candidates[i]);
            sum += candidates[i];
            backtracking(candidates, target, i + 1);
            path.removeLast();
            sum -= candidates[i];
        }
    }
}

131. 分割回文串

 

class Solution {
    private List<List<String>> res;
    private Deque<String> deque;
    public List<List<String>> partition(String s) {
        res = new ArrayList<>();
        deque = new LinkedList();
        char[] a = s.toCharArray();
        backtracking(a, 0);
        return res;
    }
    private void backtracking(char[] a, int s) {
        if (s >= a.length) {
            res.add(new ArrayList<>(deque));
            return;
        }
        for (int i = s; i < a.length; i++) {
            //是回文串,作为子集放入path内 注意不能当做stack Deque定义的stack中push方法相当于addFirst方法
            if (isDualRepeat(a, s, i)) {
                StringBuilder sb = new StringBuilder();
                for (int j = s; j <= i; j++) sb.append(a[j]);
                deque.addLast(sb.toString());
            } else continue;
            backtracking(a, i + 1);
            deque.removeLast();
        }
    }
    //判断是否是回文串
    private boolean isDualRepeat(char[] a, int s, int e) {
        for (; s < e; s++, e--) {
            if (a[s] != a[e]) return false;
        }
        return true;
    }

}

看了一下官解,优化思路 动规和记忆化搜索,这里只练习一下回溯。

参考:programmercarl.com

posted @ 2022-04-16 18:30  一梦两三年13  阅读(8)  评论(0)    收藏  举报