力扣--动态规划/深度优先算法/回溯算法93.复原IP地址

news2024/10/6 0:27:53

这题主要用了动态规划和回溯算法。

  1. 动态规划数组初始化(DP数组):

    • 首先,创建一个二维数组dp,用于记录字符串中哪些部分是合法的IP地址。
    • 对字符串进行遍历,同时考虑每个可能的IP地址部分(每部分由1到3个字符组成,对应0-255),并根据IPv4地址的规则进行判断,更新dp数组。
  2. 深度优先搜索(DFS):

    • 定义DFS函数,用于递归生成合法的IPv4地址。该函数采用回溯法,遍历每一部分可能的范围,将符合条件的部分添加到当前路径中。
    • 如果已经形成四个部分且遍历到字符串末尾,将路径转为字符串,并加入结果集。
    • 否则,继续递归生成下一部分。
    • 在生成下一部分之前,将路径中的当前部分标记为一个点号('.'),以区分IPv4地址的各个部分。
  3. 返回结果:

    • 在主函数restoreIpAddresses中,首先初始化dp数组,然后调用DFS函数,开始生成合法的IPv4地址。
    • 最后,返回生成的IPv4地址结果集。
class Solution {
    vector<string> result;  // 存储结果的容器
    vector<char> path;      // 存储当前路径的容器

    // 深度优先搜索函数,用于生成合法的IPv4地址
    void dfs(vector<vector<bool>>& dp, string s, int start, int num) {
        num++;
        if (num >= 5)  // 如果已经有四个部分了,结束递归
            return;

        // 遍历当前部分的可能范围
        for (int i = start; i - start <= 2 && i < s.size(); i++) {
            if (dp[start][i] == true) {
                // 将当前部分加入路径
                for (int j = start; j <= i; j++)
                    path.push_back(s[j]);

                // 如果已经是最后一部分且遍历到字符串末尾,将路径转为字符串加入结果集
                if (i == s.size() - 1 && num == 4) {
                    string str;
                    str.assign(path.begin(), path.end());
                    result.push_back(str);
                }
                // 否则,继续递归生成下一部分
                else {
                    path.push_back('.');
                    dfs(dp, s, i + 1, num);
                    path.pop_back();
                }

                // 回溯,将当前部分从路径中移除
                for (int j = start; j <= i; j++)
                    path.pop_back();
            }
        }
        return;
    }

public:
    // 主函数,生成合法IPv4地址的入口
    vector<string> restoreIpAddresses(string s) {
        int n = s.size();
        // dp数组用于记录字符串中哪些部分是合法的
        vector<vector<bool>> dp(n, vector<bool>(n, false));

        // 遍历字符串,初始化dp数组
        for (int i = 0; i < n; i++) {
            for (int j = i; j <= i + 2 && j < n; j++) {
                if (i == j)
                    dp[i][j] = true;
                else if (i == j - 1) {
                    if (s[i] == '0')
                        dp[i][j] = false;
                    else
                        dp[i][j] = true;
                } else {
                    if (s[i] == '0' || s[i] >= '3')
                        dp[i][j] = false;
                    else if (s[i] == '1')
                        dp[i][j] = true;
                    else {
                        if (s[i + 1] <= '4' || (s[i + 1] == '5' && s[j] <= '5'))
                            dp[i][j] = true;
                    }
                }
            }
        }

        // 调用深度优先搜索函数,开始生成合法IPv4地址
        dfs(dp, s, 0, 0);

        // 返回最终结果
        return result;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android中ANR机制

Android中的ANR分为两种&#xff0c;前台ANR和后台ANR。 前台ANR&#xff0c;是指ANR时对用户可感知&#xff0c;比如拥有当前前台可见的activity的进程&#xff0c;或者拥有前台通知的fg-service的进程&#xff0c;这些是用户可感知的场景。前台ANR&#xff0c;会出现一个系统…

岩土工程监测中振弦采集仪的选型指南与市场概况

岩土工程监测中振弦采集仪的选型指南与市场概况 振弦采集仪是岩土工程监测中常用的一种设备&#xff0c;用于测量土体的振动特性。它的选型指南和市场概况如下&#xff1a; 选型指南&#xff1a; 1. 测量参数&#xff1a;振弦采集仪可用于测量土体的振动振幅、频率、相位等参数…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化&#xff0c; 线程安全&#xff0c;但会导致类加载时间变长。饿汉模式如果使用过多&#xff0c;可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁&#xff0c; 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

go语言基础 -- goroutine与管道

go协程特点 一个线程上可以起多个goroutine&#xff0c;goroutine有以下特点&#xff1a; 有独立的栈空间共享程序堆空间调度由用户控制 下面是一个简单的协程使用案例&#xff1a; package main import("fmt""strconv" )func test() {for i : 0; i &l…

18-任务管理常用API函数

任务挂起函数 void vTaskSuspend(TaskHandle_t xTaskToSuspend) void vTaskSuspendAll(void)——挂起所有任务 其实就是将调度器锁定&#xff0c;直白点挂起所有的任务&#xff0c;就是挂起任务调度器&#xff0c;调度器被挂起后&#xff0c;就不可以进行上下文的切换&#xf…

java中数组的定义与使用

Java中的数组跟c语言的数组几乎不一样&#xff0c;我们要区分对待。在之后你就能理解到我为什么说这句话了。 1.java中数组的创建与初始化 数组的创建 如下&#xff0c;皆为数组的创建。 double[] a; int[] b; 创建时的[]里面绝对不能填数字。 数组的初始化 主要分为动态…

【Python】一文带你了解如何获取 Python模块 安装路径

【Python】一文带你了解如何获取 Python模块 安装路径 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

MyBatis进阶篇

MyBatis MyBtias工具类参数入参参数是单个参数参数是多个参数入参是POJO对象入参是Map类型 自动主键增长#{}和${}两种获取参数方式结果映射动态SQLMyBatis多表查询MyBatis注解开发 MyBtias工具类 SessionUtils.java import org.apache.ibatis.io.Resources; import org.apache…

当HR问你:“什么事会让你有成就感”你该怎么回答?【文章底部添加进大学生就业交流群】

当HR问你“什么事会让你有成就感”时&#xff0c;你可以通过以下方式回答&#xff1a; 强调目标实现&#xff1a; 表达你在达成挑战性目标时感到的满足感。举例说明你在过去的工作或项目中如何设定并成功实现了目标。 强调对团队成功的贡献&#xff1a; 谈论你与团队合作取得成…

力扣每日一题 将标题首字母大写 模拟 String API

Problem: 2129. 将标题首字母大写 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public String capitalizeTitle(String title)…

leetcode 25、k个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…

API接口数据集接口pytorch api接口获取数据

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

这五款高性能骨传导耳机入手不后悔!附带骨传导耳机选购攻略!

随着健康生活的逐渐流行&#xff0c;越来越多的人开始注重运动和健身&#xff0c;在这一背景下&#xff0c;骨传导耳机作为当下最热门的健身装备&#xff0c;已成为市场上最受欢迎的产品之一&#xff0c;随着骨传导耳机的热度增高&#xff0c;与此同时也引发了一些不良商家和劣…

第八十天 WAF攻防-漏洞利用HPP污染分块传输垃圾数据

第80天 WAF攻防-漏洞利用&HPP污染&分块传输&垃圾数据 参考点&#xff1a; #将MySQL注入函数分为几类 拆分字符串函数&#xff1a;mid、1eft、1pad等 编码函数&#xff1a;ord、hex、a3ci等 运算函数&#xff1a;*/&^&#xff01;1 ike rlike reg等 空格替换部…

如何制作产品介绍二维码(一):编辑二维码内容

本篇主要以官方模板「产品详情介绍」为例&#xff0c;教大家如何从0开始制作单个产品介绍二维码&#xff0c;在掌握操作技巧后&#xff0c;你也能快速制作出一个效果不错的二维码。 该教程主要分以下4个部分&#xff1a; 编辑内容&#xff1a;指的是如何把图片、文件、音视频…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目&#xff0c;第一道题目我没用这种方法&#xff0c;但还是做出来了&#xff0c;用的一种比较特殊的思考方法&#xff0c;就是把每一个点都判断出来&#xff0c;不满足要求的就舍弃&#xff0c;…

ElasticSearchLinux安装和springboot整合的记录和遇到的问题

前面整合遇到的一些问题有的记录在下面了&#xff0c;有的当时忘了记录下来&#xff0c;希望下面的能帮到你们 1&#xff1a;Linux安装ES 下载安装&#xff1a; 参考文章&#xff1a;连接1 连接2 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch…

如何关闭微软的Edge浏览器右击提示的:“使用copilot重写“的提示?

最近在使用微软的edge浏览器写文档的时候&#xff0c;总是不小心右击鼠标&#xff0c;提示 有时候挺烦人的&#xff0c;那怎么关闭呢&#xff1f; 打开edge浏览器的设置 在设置中搜索AI&#xff0c;并关闭AI书写的选项就好了 这样就可以获得一个干净的界面了&#xff0c;不…