LeetCode 39 组合总和
题目链接:39.组合总和
java
//剪枝优化
class Solution {
List<Integer> path = new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
backtracking(candidates, target,0, 0);
return res;
}
public void backtracking(int[] nums, int target, int sum, int startIndex){
if(sum == target){
res.add(new ArrayList(path));
return;
}
for(int i = startIndex; i < nums.length; i++){
if(sum+nums[i] > target) break;
path.add(nums[i]);
backtracking(nums, target,sum+nums[i], i);//取得是当前元素
path.removeLast();
}
}
}
LeetCode 40 组合总和II
题目链接:40.组合总和II
java
class Solution {
List<Integer> path = new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
backtracking(candidates, target, 0, 0);
return res;
}
public void backtracking(int[] nums, int target, int sum, int startIndex){
if(sum == target){
res.add(new ArrayList(path));
return;
}
for(int i = startIndex; i < nums.length; i++){
if(sum+nums[i] > target) break;
if(i != startIndex && nums[i-1] == nums[i]) continue;//i > startIndex
path.add(nums[i]);
backtracking(nums, target, sum+nums[i], i+1);
path.removeLast();
}
}
}
LeetCode 131 分割回文串
题目链接:131.分割回文串
java
class Solution {
LinkedList<String> path = new LinkedList<>();
List<List<String>> res = new ArrayList<>();
public List<List<String>> partition(String s) {
backtracking(s, 0 , new StringBuilder());
return res;
}
//每一个for都需要一个新的StringBuilder;
public void backtracking(String s, int startIndex, StringBuilder sb){
if(startIndex == s.length()){
res.add(new ArrayList(path));
return;
}
for(int i = startIndex; i < s.length(); i++){
sb.append(s.charAt(i));
if(check(sb)){
path.add(sb.toString());
backtracking(s, i+1, new StringBuilder());
path.removeLast();
}else{
continue;
}
}
}
public boolean check(StringBuilder sb){
int i = 0;
int j = sb.length() -1;
while(i < j){
if(sb.charAt(i++) != sb.charAt(j--)) return false;
}
return true;
}
}