代码随想录算法训练营第二十八天| 93.复原IP地址 ,78.子集 ,90.子集II

本文介绍了在代码随想录算法训练营中的两个问题:如何使用回溯法实现复原IP地址,以及处理整数子集(包括基本子集和去重子集II)。作者提供了Java代码示例来展示这些算法的应用。
摘要由CSDN通过智能技术生成

代码随想录算法训练营

今日任务
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();
                }
            }
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值