93. 复原 IP 地址
去重之前要先对candidates数组进行排序
回溯三部曲
1.确定回溯函数返回值和参数
返回值为void,参数为给定原字符串s,和当前开始遍历的字符串字符下标
2.确定回溯终止条件
当遍历开始下标超出字符串长度时,中止递归
3.确定回溯单层过程
从当前层开始位置开始向后遍历,判断[start,end]的子串是否是ip地址的合法组成,是的话,加入过程集合,进入下一层递归层。
若不是,直接break退出本层递归
记得回溯
剪枝:ip段的长度最大是3,因此在每层中向后遍历的次数应该小于3
class Solution {
List<String> res = new ArrayList<>();
List<String> item = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
backtracking(s, 0);
return res;
}
private void backtracking(String s, int startIndex){
if(startIndex >= s.length()){
if(item.size() == 4){
res.add(item.get(0) + "." + item.get(1) + "." + item.get(2) + "." + item.get(3));
}
return;
}
for(int i = startIndex; i < startIndex + 3 && i < s.length(); i++){
if(isLegallyIp(s, startIndex, i)){
if(item.size() == 3 && i < s.length() - 1){
continue;
}
item.add(s.substring(startIndex, i + 1));
backtracking(s, i + 1);
item.remove(item.size() - 1);
}else {
break;
}
}
}
private boolean isLegallyIp(String s, int startIndex, int endIndex){
if(s.charAt(startIndex) == '0'){
return endIndex <= startIndex;
}else {
return Integer.parseInt(s.substring(startIndex, endIndex + 1)) <= 255;
}
}
}
——————————————————————————————————————————
78. 子集
去重之前要先对candidates数组进行排序
回溯三部曲
1.确定递归函数返回值和参数
返回值为void,参数为给定数组nums,和当前开始遍历的数组索引
2.确定递归终止条件
当遍历开始下标超出数组长度时,中止递归
3.确定回溯单层过程
每层递归函数中都是一个子集,都要将当前item插入结果集合中
记得回溯
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
res.add(new ArrayList<>());
backtracking(nums,0);
return res;
}
private void backtracking(int[] nums, int startIndex){
if(startIndex >= nums.length){
return;
}
for(int i = startIndex; i < nums.length; i++){
item.add(nums[i]);
res.add(new ArrayList<>(item));
backtracking(nums, i + 1);
item.remove(item.size() - 1);
}
}
}
——————————————————————————————————————————
90. 子集 II
与78不同的是要去重
先对数组排序,后边在同一层去重即可
去重之前要先对candidates数组进行排序
回溯三部曲
1.确定递归函数返回值和参数
返回值为void,参数为给定数组nums,和当前开始遍历的数组索引
2.确定递归终止条件
当遍历开始下标超出数组长度时,中止递归
3.确定回溯单层过程
每层递归函数中都是一个子集,都要将当前item插入结果集合中
记得回溯
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
res.add(new ArrayList<>());
Arrays.sort(nums);
backtracking(nums,0);
return res;
}
private void backtracking(int[] nums, int startIndex){
if(startIndex >= nums.length){
return;
}
for(int i = startIndex; i < nums.length; i++){
if(i > startIndex && nums[i] == nums[i - 1]){
continue;
}
item.add(nums[i]);
res.add(new ArrayList<>(item));
backtracking(nums, i + 1);
item.remove(item.size() - 1);
}
}
}