代码随想录算法训练营
今日任务
93.复原IP地址 ,78.子集 ,90.子集II
93.复原IP地址
class Solution {
List<String> result=new ArrayList<>();
Deque<String> deque=new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
if(s.length()>12){
return result;
}
backtracking(s,0);
return result;
}
public void backtracking(String s,int startIndex){
if(startIndex>=s.length()){
if(deque.size()!=4){
System.out.println("nono");
return;
}
Deque<String> res=new LinkedList<>();
res.addAll(deque);
StringBuilder sb=new StringBuilder();
while(res.size()>1){
String poll = res.poll();
sb.append(poll);
sb.append(".");
}
sb.append(res.peek());
result.add(sb.toString());
return;
}
for(int i=startIndex;i<s.length();i++){
if(deque.size()>4){
break;
}
if(check(s,startIndex,i)){
String str=s.substring(startIndex,i+1);
deque.addLast(str);
}else{
continue;
}
backtracking(s,i+1);
deque.removeLast();
}
}
public boolean check(String s,int startIndex,int endIndex){
if(s.charAt(startIndex)=='0'&&startIndex!=endIndex){
//string的长度不止一位,但是首位为0
return false;
}else{
String snum=s.substring(startIndex,endIndex+1);
if(snum.length()>3){
return false;
}
System.out.println(snum);
int num= Integer.parseInt(snum);
if(num>255){
return false;
}
}
return true;
}
}
78.子集
class Solution {
List<List<Integer>> result=new ArrayList<>();
Deque<Integer> deque=new LinkedList<>();
public List<List<Integer>> subsets(int[] nums) {
backtracking(nums,0);
result.add(new ArrayList<>());
return result;
}
public void backtracking(int[] nums,int startIndex){
if(deque.size()!=0){
result.add(new ArrayList<>(deque));
}
for(int i=startIndex;i<nums.length;i++){
deque.addLast(nums[i]);
backtracking(nums,i+1);
deque.removeLast();
}
}
}
90.子集II
class Solution {
List<List<Integer>> result=new ArrayList<>();
Deque<Integer> deque=new LinkedList<>();
Map<Integer,Integer> map=new HashMap<>();
int delete=-11;
int last=-11;
public List<List<Integer>> subsetsWithDup(int[] nums) {
result.add(new ArrayList<>());
Arrays.sort(nums);
backtracking(nums,0);
return result;
}
public void backtracking(int[] nums,int startIndex){
if(deque.size()!=0){
System.out.println(new ArrayList<>(deque));
result.add(new ArrayList<>(deque));
}
for(int i=startIndex;i<nums.length;i++){
if(!map.containsKey(nums[i])){
if(nums[i]==delete&&deque.getLast()==last){
//新加入的和刚刚删除的不一样
continue;
}
deque.addLast(nums[i]);
backtracking(nums,i+1);
}
if(!deque.isEmpty()){
delete=deque.removeLast();
//System.out.println("删除的是:"+delete);
if(deque.isEmpty()){
map.put(delete,1);
}else{
last=deque.getLast();
}
}
}
}
}