1. 组合总和
在往下一层查找时,要注意
根据题意,不能往前找,而是当前元素可重复
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
int sum;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
bacKTracking(candidates, target,0);
return res;
}
public void bacKTracking(int[] candidates, int target, int start){
if(sum == target){
res.add(new ArrayList<>(path));
return;
}else if(sum > target)
return;
for(int i = start; i < candidates.length; i++){
path.add(candidates[i]);
sum += candidates[i];
bacKTracking(candidates, target, i);
path.remove(path.size()-1);
sum -= candidates[i];
}
}
}
2. 组合总和II
当前元素和同层元素的前一个元素比较,相同则跳过
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
int sum;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
bacKTracking(candidates, target,0);
return res;
}
public void bacKTracking(int[] candidates, int target, int start){
if(sum == target){
res.add(new ArrayList<>(path));
return;
}else if(sum > target)
return;
for(int i = start; i < candidates.length; i++){
if ( i > start && candidates[i] == candidates[i - 1] ) {
continue;
}
path.add(candidates[i]);
sum += candidates[i];
bacKTracking(candidates, target, i + 1);//使用下一个元素
path.remove(path.size() - 1);
sum -= candidates[i];
}
}
}
3. 分割回文串
重点是找出所有分割方法,可以理解为找组合
class Solution {
List<List<String>> res = new ArrayList<>();
List<String> path = new ArrayList<>();
public List<List<String>> partition(String s) {
backTracking(s, 0);
return res;
}
public void backTracking(String s, int start){
if(start == s.length()){
res.add(new ArrayList<>(path));
return;
}
for(int i = start; i < s.length(); i++){
String temp = s.substring(start,i + 1);
if(isPartition(temp)){
path.add(temp);
}else continue;
backTracking(s, i + 1);
path.remove(path.size() - 1);
}
}
public boolean isPartition(String s){
int i = 0;
int j = s.length() - 1;
while(i <= j){
if(s.charAt(i++) != s.charAt(j--))
return false;
}
return true;
}
}