代码随想录 Day28 - 回溯(四)

简介: 代码随想录 Day28 - 回溯(四)

93. 复原 IP 地址

复原 IP 地址这一题感觉比较难,细节点很多,字符串遍历等均需要考虑。

package jjn.carl.backtrack;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * @author Jjn
 * @since 2023/7/29 10:49
 */
public class LeetCode93 {
    public List<String> restoreIpAddresses(String s) {
        List<String> result = new ArrayList<>();
        if (s.length() > 12 || s.length() < 4) {
            return result;
        }
        backtrack(s, result, 0, 4, new ArrayList<>());
        return result;
    }
    private void backtrack(String s, List<String> result, int startIndex, int pointNum, List<String> parts) {
        if (startIndex == s.length()) {
            if (pointNum == 0) {
                result.add(String.join(".", parts));
                return;
            }
        }
        for (int i = startIndex; i < startIndex + 3; i++) {
            if (i >= s.length()) {
                break;
            }
            if (s.length() - i > pointNum * 3) {
                continue;
            }
            if (isValidPart(s, startIndex, i)) {
                parts.add(s.substring(startIndex, i + 1));
                backtrack(s, result, i + 1, pointNum - 1, parts);
                parts.remove(parts.size() - 1);
            }
        }
    }
    private boolean isValidPart(String s, int start, int end) {
        if (s == null || s.isEmpty()) {
            return false;
        }
        int subLength = end - start + 1;
        if (subLength > 3) {
            return false;
        }
        if (subLength > 1) {
            if (s.charAt(start) == '0') {
                return false;
            }
        }
        int sum = 0;
        for (int i = start; i <= end; i++) {
            int ithChar = s.charAt(i) - '0';
            sum = 10 * sum + ithChar;
        }
        return sum >= 0 && sum <= 255;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        List<String> addresses = new LeetCode93().restoreIpAddresses(s);
        System.out.println(addresses.toString());
    }
}


78. 子集

本题目需要回溯路径上的值,故在遍历的路径上直接讲结果 add 到 result。

package jjn.carl.backtrack;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * @author Jiang Jining
 * @since 2023-07-26 23:14
 */
public class LeetCode78 {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(nums, 0, new ArrayList<>(), result);
        return result;
    }
    private void backtrack(int[] nums, int startIndex, List<Integer> path, List<List<Integer>> result) {
        result.add(new ArrayList<>(path));
        for (int i = startIndex; i < nums.length; i++) {
            path.add(nums[i]);
            backtrack(nums, i + 1, path, result);
            path.remove(path.size() - 1);
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = scanner.nextInt();
        int[] nums = new int[count];
        for (int i = 0; i < count; i++) {
            nums[i] = scanner.nextInt();
        }
        List<List<Integer>> subsets = new LeetCode78().subsets(nums);
        System.out.println(String.join(",", subsets.toString()));
    }
}


90. 子集 II

本题的难点在于,去重的逻辑,当然按照下标去重,需要先做一下排序。

package jjn.carl.backtrack;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
 * @author Jiang Jining
 * @since 2023-07-26 23:32
 */
public class LeetCode90 {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        boolean[] used = new boolean[nums.length];
        backtrack(result, nums, 0, new ArrayList<>(), used);
        return result;
    }
    private void backtrack(List<List<Integer>> result, int[] nums, int startIndex, List<Integer> path, boolean[] used) {
        result.add(new ArrayList<>(path));
        for (int i = startIndex; i < nums.length; i++) {
            if (i >= 1 && nums[i] == nums[i - 1] && !used[i - 1]) {
                continue;
            }
            path.add(nums[i]);
            used[i] = true;
            backtrack(result, nums, i + 1, path, used);
            path.remove(path.size() - 1);
            used[i] = false;
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = scanner.nextInt();
        int[] nums = new int[count];
        for (int i = 0; i < count; i++) {
            nums[i] = scanner.nextInt();
        }
        List<List<Integer>> lists = new LeetCode90().subsetsWithDup(nums);
        System.out.println(String.join(",", lists.toString()));
    }
}



目录
相关文章
|
jenkins Linux 持续交付
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
西门子S7-200 SMART如何使用状态图表,如何创建、监视、强制、趋势显示
上篇文章中我们学习了S7-200 SMART系统块的组态,本篇我们来介绍在编程软件STEP7-Micro/WIN SMART中如何使用状态图表,以及如何创建、监视、强制、趋势显示。在STEP7-Micro/WIN SMART与PLC之间成功建立通信,并且将程序下载到PLC后,就可以监控和调试程序了。程序状态监控可以监视程序的运行情况,但是如果需要监控的变量较多,不能在程序编辑器中同时显示的时候就需要使用状态图表监控。接下来我们来介绍在STEP7-Micro/WIN SMART如何使用状态图表监控和调试程序。
西门子S7-200 SMART如何使用状态图表,如何创建、监视、强制、趋势显示
|
存储 监控 关系型数据库
ELK架构监控MySQL慢日志
ELK架构监控MySQL慢日志
|
容灾 分布式数据库 数据库
OB有问必答 | 分布式数据库有哪些常用的高可用及容灾方案?
本期内容结合OceanBase数据库的实践经验,向大家介绍一下OceanBase及分布式数据常用的一些高可用及容灾方案。
OB有问必答 | 分布式数据库有哪些常用的高可用及容灾方案?
|
JSON JavaScript 程序员
Qt编写地图综合应用19-地图服务
一、前言 国内提供地图服务的厂家基本上是五家,百度地图、高德地图、腾讯地图、搜狗地图、天地图,国外的一般还有谷歌地图、微软地图(BING地图),这几家的地图服务的api接口都大同小异,甚至很多函数的名字都一模一样,毕竟叫的很通俗,这样也很容易理解,除了引入的地图服务JS文件不同,对象名称不同,其他.
1147 0
|
API 图形学 Android开发
Unity复制粘贴剪切板各平台源码
Unity直接复制粘贴剪切板一句代码。 本文提供全流程,中文翻译。 助力快速完成 Unity 复制粘贴的实现 为初学者节省宝贵的时间,避免采坑! 现实测,在2018 、2019版本后 直接用一个 API 即可实现 GUIUtility.systemCopyBuffer Chinar测试 安卓 与PC 端 尚未发现任何问题 例如:直接复制一些信息,让玩家可以直接粘贴的方式,分享给好友。
3614 0
|
SQL 关系型数据库 MySQL
|
15天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾