代码随想录 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()));
    }
}



目录
相关文章
|
API 图形学 Android开发
Unity复制粘贴剪切板各平台源码
Unity直接复制粘贴剪切板一句代码。 本文提供全流程,中文翻译。 助力快速完成 Unity 复制粘贴的实现 为初学者节省宝贵的时间,避免采坑! 现实测,在2018 、2019版本后 直接用一个 API 即可实现 GUIUtility.systemCopyBuffer Chinar测试 安卓 与PC 端 尚未发现任何问题 例如:直接复制一些信息,让玩家可以直接粘贴的方式,分享给好友。
3577 0
|
4天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
15天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1309 5
|
1天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
14天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1345 87
|
1天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
3天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
189 82
2025年阿里云域名备案流程(新手图文详细流程)