93.复原IP地址
题目链接
https://leetcode.cn/problems/restore-ip-addresses/description/
题目描述
思路
class Solution {
List<String> list = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if(s.length()>12) return list;
backTraing(s,0,0);
return list;
}
public void backTraing(String s,int startIndex,int pointnum){
//终止条件
if(pointnum>=3){
if(isValid(s,startIndex,s.length()-1)){
list.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++;
backTraing(s,i+2,pointnum);
pointnum--;
//传入 i + 2 ,是因为加入了一个 . 所以 i 的后一位需要移动两个
s = s.substring(0,i+1) + s.substring(i+2);
}else {
break;
}
}
}
public Boolean isValid(String s,int startIndex,int end){
if(startIndex>end)return false;
if(s.charAt(startIndex)=='0'&&startIndex!=end) return false;
int num = 0;
for (int i = startIndex; 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.子集
题目链接
https://leetcode.cn/problems/subsets/
题目描述
思路
class Solution {
List<List<Integer>> list = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
if(nums.length==0||nums==null){
list.add(new ArrayList<>(list1));
return list;
}
backTracing(nums,0);
return list;
}
public void backTracing(int[] nums,int startIndex){
list.add(new ArrayList<>(list1));
if(startIndex>=nums.length) return;
for (int i = startIndex; i < nums.length; i++) {
list1.add(nums[i]);
backTracing(nums,i+1);
list1.remove(list1.size()-1);
}
}
}
90.子集II
题目链接
https://leetcode.cn/problems/subsets-ii/description/
题目描述
思路
只是凭借前边几题的感觉写出来的,感觉还是没有真正会
class Solution {
List<List<Integer>> list = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
boolean[] arr;
public List<List<Integer>> subsetsWithDup(int[] nums) {
arr = new boolean[nums.length];
if(nums.length==0){
list.add(new ArrayList<>(list1));
return list;
}
Arrays.sort(nums);
Arrays.fill(arr,false);
backTracking(nums,0);
return list;
}
public void backTracking(int[] nums,int startIndex){
list.add(new ArrayList<>(list1));
if(startIndex>=nums.length) return;
for (int i = startIndex; i < nums.length; i++) {
if(i>0&&nums[i] == nums[i-1]&&!arr[i-1]) continue;
arr[i] = true;
list1.add(nums[i]);
backTracking(nums,i+1);
list1.remove(list1.size()-1);
arr[i] = false;
}
}
}