39. 组合总和 - 力扣(LeetCode)
class Solution {
public List> combinationSum(int[] candidates, int target) {
List> res = new ArrayList<>();
List list = new ArrayList<>();
dfs(res, list, candidates, target, 0, 0);
return res;
}
private void dfs(List> res, List list, int[] candidates, int target, int sum, int idx) {
if (sum > target) return;
if (sum == target) {
res.add(new ArrayList(list));
}
for (int i = idx; i < candidates.length; i++) {
sum += candidates[i];
list.add(candidates[i]);
dfs(res, list, candidates, target, sum, i);
sum -= candidates[i];
list.remove(list.size() - 1);
}
}
}
40. 组合总和 II - 力扣(LeetCode)
class Solution {
public List> combinationSum2(int[] candidates, int target) {
List> res = new ArrayList<>();
List list = new ArrayList<>();
boolean[] visited = new boolean[candidates.length];
Arrays.sort(candidates);
dfs(res, list, candidates, target, visited, 0, 0);
return res;
}
private void dfs(List> res, List list, int[] candidates, int target, boolean[] visited, int sum, int idx){
if (sum > target) return;
if (sum == target) {
res.add(new ArrayList<>(list));
return;
}
for (int i = idx; i < candidates.length; i++) {
if (i > 0 && candidates[i] == candidates[i - 1] && !visited[i - 1]) continue;
sum += candidates[i];
visited[i] = true;
list.add(candidates[i]);
dfs(res, list, candidates, target, visited, sum, i + 1);
sum -= candidates[i];
visited[i] = false;
list.remove(list.size() - 1);
}
}
}
131. 分割回文串 - 力扣(LeetCode)
class Solution {
public List> partition(String s) {
List> res = new ArrayList<>();
List list = new ArrayList<>();
dfs(res, list, s, 0);
return res;
}
private void dfs(List> res, List list, String s, int idx) {
if (idx >= s.length()) {
res.add(new ArrayList<>(list));
return;
}
for (int i = idx; i < s.length(); i++) {
if (isPlindrom(s, idx, i)) {
String sub = s.substring(idx, i + 1);
list.add(sub);
} else continue;
dfs(res, list, s, i + 1);
list.remove(list.size() - 1);
}
}
private boolean isPlindrom(String s, int left, int right) {
for (int i = left, j = right; i < j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) return false;
}
return true;
}
}