classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; backtracking(candidates, target, 0); return result; }
privatevoidbacktracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); boolean[] used; public List<List<Integer>> combinationSum2(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; used = newboolean[candidates.length]; Arrays.sort(candidates); backtracking(candidates, target, 0); return result; }
privatevoidbacktracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < candidates.length; i++){ if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) continue; target -= candidates[i]; path.add(candidates[i]); used[i] = true; backtracking(candidates, target, i + 1); used[i] = false; path.removeLast(); target += candidates[i];
classSolution { List<List<String>> result = newArrayList<>(); List<String> path = newArrayList<>(); public List<List<String>> partition(String s) { if (s.length() == 0 || s == null) return result; backtracking(s, 0); return result; }
privatevoidbacktracking(String s, int start){ if (start == s.length()){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < s.length(); i++){ if (isPalindrome(s, start, i)){ path.add(s.substring(start, i + 1)); backtracking(s, i + 1); path.removeLast(); } } } privatebooleanisPalindrome(String s, int start, int end){ while (start<=end){ if (s.charAt(start) != s.charAt(end)) returnfalse; start++; end--; }
public List<String> restoreIpAddresses(String s) { if (s.length() == 0 || s == null || s.length() > 12) return result;
backtracking(s, 0, 0); return result; }
privatevoidbacktracking(String s, int start, int points){ if (points == 3){ if (isValid(s, start, s.length() - 1)){ result.add(newString(s)); return; } }
for (inti= start; i < s.length(); i++){ if (isValid(s, start, i)){ points++; s = s.substring(0, i + 1) + "." + s.substring(i + 1); backtracking(s, i + 2, points); points--; s = s.substring(0, i + 1) + s.substring(i + 2); } } }
privatebooleanisValid(String s, int start, int end){ if (start > end) returnfalse; if (s.charAt(start) - '0' == 0 && start != end) returnfalse; intnum=0;
for (inti= start; i <= end; i++){ if (s.charAt(i) - '0' > 9 || s.charAt(i) - '0' < 0) returnfalse; num = num * 10 + s.charAt(i) - '0'; if (num > 255) returnfalse; }
returntrue; } }
78 子集
注意result添加地方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> subsets(int[] nums) { backtracking(nums, 0); return result; }
privatevoidbacktracking(int[] nums, int start){ result.add(newArrayList(path)); for (inti= start; i < nums.length; i++){ path.add(nums[i]); backtracking(nums, i + 1); path.removeLast(); } } }
privatebooleansudoSolver(char[][] board){ for (inti=0; i < 9; i++){ for (intj=0; j < 9; j++){ if (board[i][j] != '.') continue;
for (chark='1'; k <= '9'; k++){ if (isValid(i, j, k, board)){ board[i][j] = k; if (sudoSolver(board)) returntrue; board[i][j] = '.'; } }
returnfalse; } }
returntrue; }
privatebooleanisValid(int row, int col, char val, char[][] board){ for (inti=0; i < 9; i++){ if (board[row][i] == val) returnfalse; } for (inti=0; i < 9; i++){ if (board[i][col] == val) returnfalse; }