day27 打卡39. 组合总和 40.组合总和II 131.分割回文串

发布时间 2023-03-27 22:44:07作者: zzzzzzsl

day27 打卡39. 组合总和 40.组合总和II 131.分割回文串

39. 组合总和

39题目链接

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        backtracking(candidates, target, 0, 0);
        return result;
    }

    private void backtracking (int[] candidates, int target, int sum, int idx) {
        if (sum > target) return;
        if (sum == target) {
            result.add(new LinkedList<>(path));
            return;
        }

        for (int i = idx; i < candidates.length; i++) {
            // 如果 sum + candidates[i] > target 就终止遍历
            if (sum + candidates[i] > target) break;
            path.add(candidates[i]);
            backtracking(candidates, target, sum + candidates[i], i);
            path.remove(path.size() - 1); // 回溯,移除路径 path 最后一个元素
        }
    }
}

40.组合总和II

40题目链接

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    boolean[] used;

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        used = new boolean[candidates.length];
        Arrays.sort(candidates);
        backTracking(candidates, target, 0, 0);
        return result;
    }

    private void backTracking(int[] candidates, int target, int startIndex, int sum) {
        if (sum > target) return;

        if (sum == target) {
            result.add(new ArrayList<>(path));
        }

        for (int i = startIndex ; i<candidates.length ; i++) {
            if (sum + candidates[i] > target) break;

            if (i>0 && candidates[i]==candidates[i-1] && !used[i-1]) continue;

            used[i] = true;
            sum += candidates[i];
            path.add(candidates[i]);
            
            backTracking(candidates, target, i+1, sum);

            used[i] = false;
            sum -= candidates[i];
            path.removeLast();
        }
    }
}

131.分割回文串

131题目链接

class Solution {
    List<List<String>> result = new ArrayList<>();
    Deque<String> que = new LinkedList<>();

    public List<List<String>> partition(String s) {
        backtracking(s, 0);
        return result;
    }

    private void backtracking(String s, int startIndex) {
        if (startIndex >= s.length()) {
            result.add(new ArrayList<>(que));
            return;
        }

        for (int i = startIndex ; i<s.length() ; i++) {
            if (isPalindrome(s, startIndex, i)) {
                que.addLast(s.substring(startIndex, i+1));
            } else {
                continue;
            }
            backtracking(s, i+1);
            que.removeLast();
        }
    }

    private boolean isPalindrome(String s, int startIndex, int end) {
        for (int i=startIndex, j=end; i<=j ; i++, j--) {
            if (s.charAt(i) != s.charAt(j))
                return false;
        }
        return true;
    }
}

参考资料

代码随想录