classSolution{List<String> res =newArrayList<>();publicList<String>restoreIpAddresses(String s){backtracking(s,0,0);return res;}publicvoidbacktracking(String s,int startIndex,int pointNum){//当点数增加到3时,就将当前结果加入到结果集中if(pointNum ==3){//这里增加判断的目的是判断最后一段是否符合要求。if(isValid(s, startIndex, s.length()-1)){
res.add(s);return;}}for(int i = startIndex; i < s.length(); i++){if(isValid(s, startIndex, i)){
s = s.substring(0, i +1)+'.'+ s.substring(i +1);//将“.”加入其中
pointNum++;//点数++backtracking(s, i +2, pointNum);//递归
pointNum--;//点数--
s = s.substring(0, i +1)+ s.substring(i +2);//回溯处理,把已插入的“.”给删除掉。}else{break;}}}//判断所截取的字符串是否在0-255之间,同时排除了任意数字之前带零的情况,比如01,这种格式是错误的。publicbooleanisValid(String s,int start,int end){if(start > end)returnfalse;//没有字符串可截取if(s.charAt(start)=='0'&& start != end)returnfalse;//排除01这种错误格式int num =0;for(int i = start; i <= end; i++){if(s.charAt(i)>'9'|| s.charAt(i)<'0')returnfalse;//单位数应在0-9之间
num =10* num +(s.charAt(i)-'0');//计算加起来之后为多少,例如255if(num >255)returnfalse;//大于255则排除掉。}returntrue;}}
78.子集
学习文章链接:
思路:见注释
代码:
classSolution{List<List<Integer>> res =newArrayList<>();LinkedList<Integer> path =newLinkedList<>();publicList<List<Integer>>subsets(int[] nums){backtracking(nums,0);return res;}publicvoidbacktracking(int[] nums,int startIndex){
res.add(newArrayList<>(path));//既然是子集,那么每递归一次就要将path加入到res中。if(startIndex >= nums.length){return;}//这里倒是蛮简单吧。for(int i = startIndex; i < nums.length; i++){
path.add(nums[i]);backtracking(nums, i +1);
path.removeLast();}}}