23th Day| 39.组合总和,40.组合总和II,131.分割回文串
LeetCode 39 组合总和
题目链接:39.组合总和
//剪枝优化
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
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 > startIndexpath.add(nums[i]);backtracking(nums, target, sum+nums[i], i+1);path.removeLast();}}
}
LeetCode 131 分割回文串
题目链接:131.分割回文串
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;}
}