算法训练营day28

代码参考liweiwei

一、复原IP地址
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class Solution {

    public List<String> restoreIpAddresses(String s) {
        int len = s.length();
        List<String> res = new ArrayList<>();
        if (len > 12 || len < 4) {
            return res;
        }

        Deque<String> path = new ArrayDeque<>(4);
        dfs(s, len, 0, 4, path, res);
        return res;
    }

    // 需要一个变量记录剩余多少段还没被分割

    private void dfs(String s, int len, int begin, int residue, Deque<String> path, List<String> res) {
        if (begin == len) {
            if (residue == 0) {
                res.add(String.join(".", path));
            }
            return;
        }

        for (int i = begin; i < begin + 3; i++) {
            if (i >= len) {
                break;
            }

            if (residue * 3 < len - i) {
                continue;
            }

            if (judgeIpSegment(s, begin, i)) {
                String currentIpSegment = s.substring(begin, i + 1);
                path.addLast(currentIpSegment);

                dfs(s, len, i + 1, residue - 1, path, res);
                path.removeLast();
            }
        }
    }

    private boolean judgeIpSegment(String s, int left, int right) {
        int len = right - left + 1;
        if (len > 1 && s.charAt(left) == '0') {
            return false;
        }

        int res = 0;
        while (left <= right) {
            res = res * 10 + s.charAt(left) - '0';
            left++;
        }

        return res >= 0 && res <= 255;
    }
}
二、子集
import java.util.ArrayList;
import java.util.List;


public class Solution {

    private List<List<Integer>> res;

    private void find(int[] nums, int begin, List<Integer> pre) {
        // 没有显式的递归终止
        res.add(new ArrayList<>(pre));// 注意:Java 的引用传递机制,这里要 new 一下
        for (int i = begin; i < nums.length; i++) {
            pre.add(nums[i]);
            find(nums, i + 1, pre);
            pre.remove(pre.size() - 1);// 组合问题,状态在递归完成后要重置
        }
    }

    public List<List<Integer>> subsets(int[] nums) {
        int len = nums.length;
        res = new ArrayList<>();
        if (len == 0) {
            return res;
        }
        List<Integer> pre = new ArrayList<>();
        find(nums, 0, pre);
        return res;
    }
}
三、子集2
// 使用used数组
class Solution {
   List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
   LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
   boolean[] used;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        if (nums.length == 0){
            result.add(path);
            return result;
        }
        Arrays.sort(nums);
        used = new boolean[nums.length];
        subsetsWithDupHelper(nums, 0);
        return result;
    }
    
    private void subsetsWithDupHelper(int[] nums, int startIndex){
        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] && !used[i - 1]){
                continue;
            }
            path.add(nums[i]);
            used[i] = true;
            subsetsWithDupHelper(nums, i + 1);
            path.removeLast();
            used[i] = false;
        }
    }
}

// 不使用used数组
class Solution {

  List<List<Integer>> res = new ArrayList<>();
  LinkedList<Integer> path = new LinkedList<>();
  
  public List<List<Integer>> subsetsWithDup( int[] nums ) {
    Arrays.sort( nums );
    subsetsWithDupHelper( nums, 0 );
    return res;
  }


  private void subsetsWithDupHelper( int[] nums, int start ) {
    res.add( new ArrayList<>( path ) );

    for ( int i = start; i < nums.length; i++ ) {
        // 跳过当前树层使用过的、相同的元素
      if ( i > start && nums[i - 1] == nums[i] ) {
        continue;
      }
      path.add( nums[i] );
      subsetsWithDupHelper( nums, i + 1 );
      path.removeLast();
    }
  }

}

相关推荐

  1. 算法训练day28

    2024-04-30 23:58:02       31 阅读
  2. 算法训练Day23

    2024-04-30 23:58:02       66 阅读
  3. 算法训练Day24

    2024-04-30 23:58:02       62 阅读
  4. 算法训练Day25

    2024-04-30 23:58:02       61 阅读
  5. 算法训练Day29

    2024-04-30 23:58:02       58 阅读
  6. 算法训练day21

    2024-04-30 23:58:02       34 阅读
  7. 算法训练day22

    2024-04-30 23:58:02       29 阅读
  8. 算法训练day24

    2024-04-30 23:58:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 23:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 23:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 23:58:02       82 阅读
  4. Python语言-面向对象

    2024-04-30 23:58:02       91 阅读

热门阅读

  1. php变量创建和定义规则和常见常量

    2024-04-30 23:58:02       33 阅读
  2. 【设计模式】13、template 模板模式

    2024-04-30 23:58:02       30 阅读
  3. 使用ssh一台机器跳转到另一台机器

    2024-04-30 23:58:02       32 阅读
  4. 洛谷 P1055 [NOIP2008 普及组] ISBN 号码

    2024-04-30 23:58:02       37 阅读
  5. Git分支策略与工作流

    2024-04-30 23:58:02       40 阅读
  6. MySQL面试题:经典面试题之“B+树”

    2024-04-30 23:58:02       28 阅读
  7. Spring 如何解决 Bean 循环依赖

    2024-04-30 23:58:02       28 阅读
  8. oracle regexp_replace的用法

    2024-04-30 23:58:02       31 阅读
  9. 制作和合入git补丁

    2024-04-30 23:58:02       27 阅读
  10. Go语言中如何实现协程同步

    2024-04-30 23:58:02       30 阅读