93.复原IP地址
题目链接:力扣题目链接
思路:与“131.分割回文串”相似,回文中的回文检查替换为是否0开头和是否在0-255范围内的检查即可,回溯中需要检查current是否是4个部分且String是否用尽作为退出条件,for循环可以限制执只循环三次。
78.子集
题目链接:力扣题目链接
思路:从第一个数组就放入current中,不管怎样都放入最后的结果result中,迭代即可。
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> current = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
backtracking(nums,0);
return result;
}
public void backtracking(int[] nums,int j){
result.add(new ArrayList<>(current));
for(int i= j;i<nums.length;i++){
current.add(nums[i]);
backtracking(nums,i+1);
current.remove(current.size()-1);
}
}
}
※要清楚子集问题和组合问题、分割问题的的区别,子集是收集树形结构中树的所有节点的结果。
而组合问题、分割问题是收集树形结构中叶子节点的结果。
90.子集II
题目链接:力扣题目链接
思路:就是“78.子集”和“40.组合总和II”的组合而已。在递归for循环中添加一个判断即可。
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> current = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
backtracking(nums,0);
return result;
}
public void backtracking(int[] nums,int j){
result.add(new ArrayList<>(current));
for(int i= j;i<nums.length;i++){
if(i>j&&nums[i]==nums[i-1]){
continue;
}
current.add(nums[i]);
backtracking(nums,i+1);
current.remove(current.size()-1);
}
}
}
时间:1.5h