● 93.复原IP地址
不是一个一个加,而是字符串一定,变的是截取的下标
res集合里面添加的是字符串s,s里面是含“.”的。。
class Solution {
List<String> res = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
backTrack(s,0,0);
return res;
}
public void backTrack(String s,int startIndex, int pointNum){
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++;
backTrack(s,i+2,pointNum);
pointNum--;
s=s.substring(0,i+1)+s.substring(i+2);
}else{
break;
}
}
}
public boolean isValid(String 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)<'0'||s.charAt(i)>'9'){return false;}
num = num*10+(s.charAt(i)-'0');
if(num>255){
return false;
}
}
return true;
}
}
● 78.子集
class Solution {
List<Integer> path = new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
backTracking(nums,0);
return res;
}
public void backTracking(int[] nums, int startIndex){
res.add(new ArrayList<>(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
class Solution {
List<Integer> path=new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
backTracking(nums,0,used);
return res;
}
public void backTracking(int[] nums,int startIndex,boolean[] used){
res.add(new ArrayList<>(path));
if(startIndex>=nums.length){
return;
}
for(int 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;
}
}
}