39. 组合总和 - 力扣(LeetCode)
class Solution {
ArrayList<Integer> oneResult = new ArrayList<>();
ArrayList<List<Integer>> results = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
doCombinationSum(candidates,target,0,0);
return results;
}
private void doCombinationSum(int[] candidates, int target, int sum, int startPos) {
if(sum == target){
results.add(new ArrayList<>(oneResult));
return;
}
for(int i=startPos;i<candidates.length;i++){
if(sum + candidates[i] > target){
return;
}
sum += candidates[i];
oneResult.add(candidates[i]);
doCombinationSum(candidates,target,sum,i);
sum -= candidates[i];
oneResult.remove(oneResult.size()-1);
}
}
}
40. 组合总和 II - 力扣(LeetCode)
class Solution {
ArrayList<Integer> prev = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
ArrayList<Integer> oneResult = new ArrayList<>();
ArrayList<List<Integer>> results = new ArrayList<>();
Arrays.sort(candidates);
doCombinationSum2(candidates,target,0,0,oneResult,results);
return results;
}
private void doCombinationSum2(int[] candidates, int target,int startPos,int sum,
ArrayList<Integer> oneResult,ArrayList<List<Integer>> results){
if(sum == target){
results.add(new ArrayList<>(oneResult));
return;
}
for(int i=startPos;i<candidates.length;i++){
if(sum + candidates[i] > target){
return;
}
if(i>startPos && candidates[i-1] == candidates[i]){
continue;
}
sum += candidates[i];
oneResult.add(candidates[i]);
doCombinationSum2(candidates,target,i+1,sum,oneResult,results);
sum -= candidates[i];
oneResult.remove(oneResult.size()-1);
}
}
}
131. 分割回文串 - 力扣(LeetCode)
class Solution {
ArrayList<String> oneResult = new ArrayList<>();
ArrayList<List<String>> results = new ArrayList<>();
public List<List<String>> partition(String s) {
char[] chars = s.toCharArray();
doPartition(chars, 0);
return results;
}
private void doPartition(char[] chars, int startPos) {
if (startPos == chars.length) {
results.add(new ArrayList<>(oneResult));
return;
}
for (int i = startPos; i < chars.length; i++) {
String subString = isPalindromicStringThenGet(chars, startPos, i);
if (subString == null) {
continue;
}
oneResult.add(subString);
doPartition(chars, i + 1);
oneResult.remove(oneResult.size() - 1);
}
}
private String isPalindromicStringThenGet(char[] chars, int begin, int end) {
int left = begin, right = end;
while (left <= right) {
if (chars[left] == chars[right]) {
left++;
right--;
} else {
return null;
}
}
return new String(chars, begin, end - begin + 1);
}
}