重点:
- 剪枝方法(一般解决去重的办法可以考虑树层减枝):
for(int i=index;i<condidates.length && sum+condidates[i]<=target;i++) {
//跳过同一树层使用过的元素
if (i > index && condidates[i] == condidates[i - 1]) {
continue;
}
path.add(condidates[i]);
dps(condidates,target,sum+condidates[i],i+1);
path.remove(path.size()-1);
}
LeetCode39. 组合总和
List<Integer> path = new ArrayList<>();
Set<List<Integer>> dp = new HashSet<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
if(candidates.length==0) return list;
//先进行排序防止重复
Arrays.sort(candidates);
dps(candidates,target,0,0);
list.addAll(dp);
return list;
}
public void dps(int[] condidates,int target,int sum,int index) {
if(target==sum) {
List<Integer> sortedPath = new ArrayList<>(path);
// Collections.sort(sortedPath);
dp.add(sortedPath);
return;
}
for(int i=index;i<condidates.length && sum+condidates[i]<=target;i++) {
path.add(condidates[i]);
dps(condidates,target,sum+condidates[i],i);
path.remove(path.size()-1);
}
}
LeetCode40.组合总和II
List<Integer> path = new ArrayList<>();
Set<List<Integer>> dp = new HashSet<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
if(candidates.length==0) return list;
//先进行排序防止重复
Arrays.sort(candidates);
dps(candidates,target,0,0);
list.addAll(dp);
return list;
}
public void dps(int[] condidates,int target,int sum,int index) {
if(target==sum) {
List<Integer> sortedPath = new ArrayList<>(path);
// Collections.sort(sortedPath);
dp.add(sortedPath);
return;
}
for(int i=index;i<condidates.length && sum+condidates[i]<=target;i++) {
//跳过同一树层使用过的元素
if (i > index && condidates[i] == condidates[i - 1]) {
continue;
}
path.add(condidates[i]);
dps(condidates,target,sum+condidates[i],i+1);
path.remove(path.size()-1);
}
}
LeetCode131.分割回文串
public List<List<String>> partition(String s) {
if(s.length()==0)return dp;
dps(s,0);
return dp;
}
List<List<String>> dp = new ArrayList<>();
List<String> path = new ArrayList<>();
public void dps(String s,int index) {
if(index>=s.length()) {
dp.add(new ArrayList<>(path));
return ;
}
for(int i=index;i<s.length();i++) {
if(isPalindrome(s,index,i)) {
path.add(s.substring(index,i+1));
dps(s,i+1);
path.remove(path.size()-1);
}else {
continue;
}
}
}
public boolean isPalindrome(String s,int start,int end) {
while(start<end) {
if(s.charAt(start)!=s.charAt(end)) {
return false;
}
start++;
end--;
}
return true;
}