回溯day3
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;
}
}
看了一下官解,优化思路 动规和记忆化搜索,这里只练习一下回溯。