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



目录
打赏
0
0
0
0
2
分享
相关文章
Unity复制粘贴剪切板各平台源码
Unity直接复制粘贴剪切板一句代码。 本文提供全流程,中文翻译。 助力快速完成 Unity 复制粘贴的实现 为初学者节省宝贵的时间,避免采坑! 现实测,在2018 、2019版本后 直接用一个 API 即可实现 GUIUtility.systemCopyBuffer Chinar测试 安卓 与PC 端 尚未发现任何问题 例如:直接复制一些信息,让玩家可以直接粘贴的方式,分享给好友。
3491 0
kde
|
6天前
|
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
3738 8
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
655 1
Dify MCP 保姆级教程来了!
大语言模型,例如 DeepSeek,如果不能联网、不能操作外部工具,只能是聊天机器人。除了聊天没什么可做的。
994 10
【保姆级图文详解】大模型、Spring AI编程调用大模型
【保姆级图文详解】大模型、Spring AI编程调用大模型
428 7
【保姆级图文详解】大模型、Spring AI编程调用大模型
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)
本文详细介绍了Maven的项目管理工具特性、安装步骤和配置方法。主要内容包括: Maven概述:解释Maven作为基于POM的构建工具,具备依赖管理、构建生命周期和仓库管理等功能。 安装步骤: 从官网下载最新版本 解压到指定目录 创建本地仓库文件夹 关键配置: 修改settings.xml文件 配置阿里云和清华大学镜像仓库以加速依赖下载 设置本地仓库路径 附加说明:包含详细的配置示例和截图指导,适用于各种操作系统环境。 本文提供了完整的Maven安装和配置
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)
|
3天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
668 0
Excel数据治理新思路:引入智能体实现自动纠错【Python+Agent】
本文介绍如何利用智能体与Python代码批量处理Excel中的脏数据,解决人工录入导致的格式混乱、逻辑错误等问题。通过构建具备数据校验、异常标记及自动修正功能的系统,将数小时的人工核查任务缩短至分钟级,大幅提升数据一致性和办公效率。
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
阿里云推出基于场景的解决方案免费试用活动,新老用户均可领取100点试用点,完成部署还可再领最高100点,相当于一年可获得最高200元云资源。覆盖AI、大数据、互联网应用开发等多个领域,支持热门场景如DeepSeek部署、模型微调等,助力企业和开发者快速验证方案并上云。
333 23
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
企业如何用Data Agent实现数据价值效率的飞跃
在数字化转型背景下,数据被视为“新时代的石油”,但多数企业仍面临数据价值难以高效挖掘的困境。文章深入剖析了当前数据分析中存在的“被动响应”模式及其带来的四大挑战,并提出通过Data Agent实现主动智能与数据分析民主化的新路径。Data Agent基于大语言模型和强化学习技术,具备理解、思考与行动能力,能够从“人找数据”转变为“数据找人”,推动数据洞察从专业人员走向全员参与。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问