● 93.复原IP地址 Restore IP Addresses - LeetCode
void backtracking(s, startIndex, pointSum)
if (pointSum == 3)
if (isValid(s, startIndex,s.size() - 1)//左闭右闭区间
res.add(s);
return;
for (int i = stratIndex; i < s.size(); i++)
if (isValid(s, startIndex, i))//左闭右闭区间[StartIndex, i]
s.insert(sbegin() + i + 1, '.');
pointSum += 1;
backtracking(s, i + 2, pointSum);
s.remove(s.begin() + i + 1);
pointSum -= 1;
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder(s);
backtracking(res, sb, 0, 0);
return res;
}
private void backtracking(List<String> res, StringBuilder sb, int startIndex, int pointSum) {
if (pointSum == 3) {
if (isValid(sb, startIndex, sb.length() - 1)) {
res.add(sb.toString());
}
return;
}
for (int i = startIndex; i < sb.length(); i++) {
if (isValid(sb, startIndex, i)) {
sb.insert(i + 1, '.');
pointSum += 1;
backtracking(res, sb, i + 2, pointSum);
sb.deleteCharAt(i + 1);
pointSum -= 1;
} else break;
}
}
private boolean isValid(StringBuilder s, int start, int end) {
if (start > end) return false;
if (s.charAt(start) == '0' && start != end) {
return false;
}
int num = 0;
for (int i = start; i <= end; i++) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') return false;
int digit = s.charAt(i) - '0';
num = num * 10 + digit;
if (num > 255) {
return false;
}
}
return true;
}
}
● 78.子集 Subsets - LeetCode
二维 res
一维 path
void backtracking(nums, startIndex)
res.add(path);
if (startIndex == nums.length)
return;
for (int i = startIndex; i < nums.length; i++)
path.add(nums[i]);
backtracking(nums, i + 1);
path.remove(path.size() - 1);
● 90.子集II Subsets II - LeetCode
sort(nums)
used[]
二维 res
一维 path
void backtracking(nums, startIndex, used)
res.add(path);
for (i = startIndex; i< nums.length; i++)
if ( i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) continue;
path.add(nums[i]);
used[i] = true;
backtracking(nums, i + 1, used)
path.remove(path,size() - 1);
used[i] = false;
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
backtracking(res, path, nums, used, 0);
return res;
}
private void backtracking(List<List<Integer>> res, List<Integer> path, int[] nums, boolean[] used, int startIndex) {
res.add(new ArrayList<>(path));
for (int i = startIndex; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
path.add(nums[i]);
used[i] = true;
backtracking(res, path, nums, used, i + 1);
path.remove(path.size() - 1);
used[i] = false;
}
}
}