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

93. Restore IP Addresses

  • 思路
    • java
      class Solution {
          List result = new ArrayList();
          
          public List restoreIpAddresses(String s) {
              if(s.length() > 12){
                  return result;
              }
              helper(s, 0, 0);
              return result;
              
          }
          private void helper(String s, int startIndex, int pointNum){
              if(pointNum == 3){
                  if (isValid(s, startIndex, s.length() - 1)){
                      result.add(s);
                  }
                   return;
              }
              if(pointNum > 3 || (pointNum == 3 && !isValid(s,startIndex, s.length()-1))){
                      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 ++;
                      helper(s, i + 2, pointNum);//i+2是因为之前加了个"."
                      pointNum--;
                      s = s.substring(0, i+1) + s.substring(i + 2);
                  }else{
                      break;
                  }
              }
          }
          private boolean isValid(String s, int start, int end){
              if(start > end || (end - start >2)){ //这里要确保每次用来比较的数是小于等于3位的,要不然用Integer.parseInt()方法可能会遇到过大的数字
                  return false;
              }
              if(s.charAt(start) == '0' && start != end){
                  return false;
              }
              int num =0;
            //for 循环str转数字可以用Intger.parseInt(str)来代替
            //String str = s.substring(start, end+1);
            //int num = Integer.parseInt(str);
              for(int i = start; i< end +1; i++){
                  if(s.charAt(i) > '9' || s.charAt(i) < '0'){
                      return false;
                  }
              
              num = num * 10 +(s.charAt(i) - '0');
              if(num >255){
                  return false;
              }
              }
              return true;
          }
      }
    • 78. Subsets
    • 思路
      • java
        
        class Solution {
            List> result = new ArrayList();
            LinkedList path = new LinkedList();
            
            public List> subsets(int[] nums) {
                helper(nums, 0);
                return result;
            }
            private void helper(int[] nums, int startIndex){
                result.add(new ArrayList(path));
                if(startIndex >= nums.length){
                    
                    return;
                }
                for(int i = startIndex; i < nums.length; i++ ){
                    path.add(nums[i]);
                    helper(nums, i + 1);
                    path.removeLast();
                }
            }
        }

 90. Subsets II

  • 思路
    • backtrack, dfs
    • sort的原因是要比较前后重复的数
      • 如果不sort,就要采用[[491. Increasing Subsequences]]中的方法
      • java
        class Solution {
            List> result = new ArrayList();
            LinkedList path = new LinkedList();
            boolean mark = false;
            public List> subsetsWithDup(int[] nums) {
                Arrays.sort(nums);
                helper(nums, 0, mark);
                return result;
            }
            
            private void helper(int[] nums, int startIndex, boolean mark){
                result.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] && !mark ){
                        continue;
                    }
                    path.add(nums[i]);
                    mark = true;
                    helper(nums, i+1, mark);
                    path.removeLast();
                    mark = false;
                }
            }
        }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值