第七章 回溯算法part03
大纲
● 39. 组合总和
● 40.组合总和II
● 131.分割回文串
leetcode 39
组合总和
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtrack(k, n, 0, 1);
return res;
}
private void backtrack(int k, int n, int sum, int index) {
if (sum > n) return;
if (item.size() == k && sum == n) {
res.add(new ArrayList<>(item));
return;
}
for (int i = index; i <= 9; i++) {
item.add(i);
backtrack(k, n, sum + i, i + 1);
item.remove(item.size() - 1);
}
}
}
leetcode 40
组合总和II
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
backtrack(candidates, target, 0, 0);
return res;
}
private void backtrack(int[] candidates, int target, int sum, int index) {
if (sum > target) return;
if (sum == target) {
res.add(new ArrayList<>(item));
return;
}
for (int i = index; i < candidates.length; i++) {
if (i > index && candidates[i] == candidates[i - 1]) continue;
item.add(candidates[i]);
backtrack(candidates, target, sum + candidates[i], i + 1);
item.remove(item.size() - 1);
}
}
}
leetcode 131
分割回文串
class Solution {
List<List<String>> res = new ArrayList<>();
List<String> item = new ArrayList<>();
public List<List<String>> partition(String s) {
backtrack(s, 0);
return res;
}
private void backtrack(String s, int index) {
if (index == s.length()) {
res.add(new ArrayList<>(item));
return;
}
for (int i = index; i < s.length(); i++)
if (isPalidrome(s, index, i)) {
item.add(s.substring(index, i + 1));
backtrack(s, i + 1);
item.remove(item.size() - 1);
}
}
private boolean isPalidrome(String s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--)
if (s.charAt(i) != s.charAt(j)) return false;
return true;
}
}