算法训练 day28 | 93.复原IP地址 78.子集 90.子集II

93.复原IP地址


题目链接:复原IP地址

视频讲解:回溯算法如何分割字符串并判断是合法IP?

递归

1、确定递归函数返回值和参数

声明一个全局变量(字符串数组),保存满足条件的字符串作为结果。分割和加 ' . ' 时直接对原字符串进行处理,函数传入字符串 s 、遍历的起始位置 idx 、记录 ' . ' 个数的变量 cnt。

2、确定终止条件

当cnt等于三的时候,还要判断截取的子串是否满足IP地址的条件(需另写一个函数判断),当这两个条件都成立时,将处理好的字符串放入结果集里。

3、确定单层搜索逻辑

在for循环中是从[idx, i]这个区间截取子串,判断该子串是否合法,若合法在其后面加上 ' . ' ,若不合法结束本层循环。要注意,下一层递归要从 i + 2 开始,因为字符串中加了个 ' . ' 。回溯是也要把 ' . ' 去掉。

// 时间复杂度: O(3^4),IP地址最多包含4个数字,每个数字最多有3种可能的分割方式,则搜索树的最大深度为4,每个节点最多有3个子节点。
// 空间复杂度: O(n)
class Solution {
private:vector<string> result;// 记录结果// startIndex: 搜索的起始位置,pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum == 3) { // 逗点数量为3时,分隔结束// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;}for (int i = startIndex; i < s.size(); i++) {if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法s.insert(s.begin() + i + 1 , '.');  // 在i的后面插入一个逗点pointNum++;backtracking(s, i + 2, pointNum);   // 插入逗点之后下一个子串的起始位置为i+2pointNum--;                         // 回溯s.erase(s.begin() + i + 1);         // 回溯删掉逗点} else break; // 不合法,直接结束本层循环}}// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法bool isValid(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s[i] - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;}
public:vector<string> restoreIpAddresses(string s) {result.clear();if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了backtracking(s, 0, 0);return result;}
};

78.子集

题目链接:子集

视频讲解:回溯算法解决子集问题,树上节点都是目标集和!

        本题与77.组合无异,只是本题不需要终止条件,当forc循环遍历完了,递归也就结束了。

// 时间复杂度: O(n * 2^n)
// 空间复杂度: O(n)
class Solution {
private:vector<vector<int>> ret;vector<int> v;void back(vector<int>& nums, int idx){ret.push_back(v);for (int i = idx; i < nums.size(); ++i){v.push_back(nums[i]);back(nums, i + 1);v.pop_back();}}public:vector<vector<int>> subsets(vector<int>& nums) {back(nums, 0);return ret;}
};

90.子集II

题目链接:子集II

视频讲解:回溯算法解决子集问题,如何去重?

        本题其实就是40.组合总和II和78.子集的结合,切割时用used数组去重,写完这两题,再做本题如鱼得水。


// 时间复杂度: O(n * 2^n)
// 空间复杂度: O(n)
class Solution {
private:vector<vector<int>> ret;vector<int> v;void back(vector<int>& nums, int idx, vector<bool> used){ret.push_back(v);for (int i = idx; i < nums.size(); ++i){if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){continue;}used[i] = true;v.push_back(nums[i]);back(nums, i + 1, used);used[i] = false;v.pop_back();}}public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());vector<bool> used(nums.size(), false);back(nums, 0, used);return ret;}
};

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

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

相关文章

微信小程序之WXSS模板样式、页面配置(.json)和网络数据请求

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

openssl3.2/test/certs - 024 - EC cert with named curve

文章目录 openssl3.2/test/certs - 024 - EC cert with named curve概述笔记END openssl3.2/test/certs - 024 - EC cert with named curve 概述 openssl3.2 - 官方demo学习 - test - certs 官方脚本骗人的, 并没有生成ecc证书, 应该是官方脚本有bug, 可以借鉴官方思路, 自己…

CS8370错误,这是由于使用了C# 7.3中不支持的功能

目录 背景: 第一种方法: 第二种办法: 背景: 在敲代码的时候&#xff0c;程序提示报错消息提示:CS8370错误&#xff0c;那么这是什么原因导致的&#xff0c;这是由于使用了C# 7.3中不支持的功能&#xff0c;不支持该功能&#xff0c;那就是版本太低我们就需要升级更高的版本&…

振弦采集仪在桥梁健康监测中的应用与分析

振弦采集仪在桥梁健康监测中的应用与分析 振弦采集仪是一种专门用于桥梁健康监测的设备&#xff0c;通过对桥梁结构的振动信号进行采集和分析&#xff0c;可以实时监测桥梁的结构健康状况并提前预警潜在问题。 振弦采集仪主要通过在桥梁结构上安放振弦传感器&#xff0c;采集…

linux usb设备网络共享 usb/ip

USB设备的网络共享可以通过USB/IP来实现&#xff0c; USB/IP把USB I/O信息封装成TCP/IP格式在网络端传输 &#xff0c;可以实现usb的全部功能&#xff0c;且跨平台&#xff0c;是个透明的设备共享机制。 一、服务端 $sudo modprobe usbip-core$sudo modprobe usbip_host$usbip…

LiveVideoStack人物专访:深耕多媒体二十载,他怎么看未来的视频云?

抓住已知的&#xff0c;迎面未知的。 编者按&#xff1a; 大模型、降本、出海&#xff0c;是多媒体从业者交流的高频词&#xff0c;内容与交互的需求层出不穷&#xff0c;大模型与AI的演进目不暇接&#xff0c;让增速低走的视频云迎面新的机遇和挑战。作为一个跨越中美多媒体行…

[MySQL]基础的增删改查

目录 1.前置介绍 2.数据库操作 2.1显示当前数据库 2.2创建数据库 2.3 使用数据库 2.4 删除数据库 3.常用数据类型 3.1整型和浮点型 3.2字符串类型 4.表的操作 4.1查看表结构 4.2创建表 4.3删除表 5.重点 5.1操作数据库 5.2常用数据类型 5.3操作表 1.前置介绍 …

微信小程序首页、界面布局、功能简洁(示例三)

微信小程序首页界面布局、页面简洁&#xff0c;功能简单 直接上具体代码&#xff1a; 1、js代码 Page({/*** 页面的初始数据*/data: {imgList: [../../images/demo.jpg, ../../images/demo.jpg, ../../images/demo.jpg],navList: [{src: ../../images/nav1.png,title: 菜单一}…

IntelliJ IDEA 快捷键大全

IntelliJ IDEA 快捷键大全 一、文本编辑二、构建、编译项目 一、文本编辑 CtrlN 查找类 CtrlN 查找文件 CtrlF 查找文本 可以根据需求去选择红框内的选项 CtrlX 剪切 剪切选中文本&#xff0c;如果未选中则剪切当前行CtrlC 复制 复制选中文本&#xff0c;如果未选中则复制当前…

WEB前端递归数组模块详解

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>function fn(n){for(let i 0; i< n; i){for(let j 0; j < n; j){console.log(i)}}}//递归函数&#xff1a;…

机器学习工程师在人工智能时代的角色

机器学习工程师在人工智能时代的角色 在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为许多行业不可或缺的一部分。从流程自动化到增强客户体验&#xff0c;人工智能具有改变企业的巨大潜力。这一变革性技术的核心是机器学习&#xff0c;该领域专注于开…

【Flink-1.17-教程】-【四】Flink DataStream API(3)转换算子(Transformation)【用户自定义函数(UDF)】

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;3&#xff09;转换算子&#xff08;Transformation&#xff09;【用户自定义函数&#xff08;UDF&#xff09;】 1&#xff09;函数类&#xff08;Function Classes&#xff09;2&#xff09;富函数类&#xff08;R…

智慧工厂视频监控平台EasyCVR公网收流后内网设备无法播放是什么原因?

安防视频监控平台EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;此外&am…

如何在科技创新中发挥国有企业的战略支撑作用?

要在科技创新中发挥国有企业的战略支撑作用&#xff0c;需要采取以下措施&#xff1a; 1. 强化国有企业创新主体地位&#xff1a;鼓励和支持国有企业加强技术创新、产品创新、组织创新和市场创新&#xff0c;提高自主创新能力。政府可以给予国有企业一定的政策和资金支持&…

机器学习分类模型评价指标总结(准确率、精确率、召回率、Fmax、TPR、FPR、ROC曲线、PR曲线,AUC,AUPR)

为了看懂论文&#xff0c;不得不先学一些预备知识&#xff08;&#xff08;55555 主要概念 解释见图 TP、FP、TN、FN 准确率、精确率&#xff08;查准率&#xff09;、召回率&#xff08;查全率&#xff09; 真阳性率TPR、伪阳性率FPR F1-score2TP/(2*TPFPFN) 最大响应分…

netty源码:(46) TailContext

TailContext是DefaultChannelPipeline中的一个内部类&#xff0c;它是一个ChannelInboundHandler TailContext在我们所添加的自己定义的所有ChannelInboundHandler(比如通过addLast方法&#xff09;之后&#xff0c;是整个入栈消息处理的最后一环&#xff0c;也就是tail. 它的…

Django 手把手教你搭建MYSQL多数据源 实现读写分离

目录 一、创建3.2版本的Django项目 二、配置MYSQL多数据源 三、实现读写分离 一、创建3.2版本的Django项目 第一步&#xff1a;创建虚拟环境 第二步&#xff1a;打开终端安装django pip install django3.2 第三步&#xff1a;创建项目 django-admin startproject django_…

windows用msvc编译opencv、opencv-python、opencv_contrib、cuda

如要用mingw编译opencv&#xff0c;参考我另外一篇文章https://blog.csdn.net/weixin_44733606/article/details/135741806。 如要用Ubuntu编译opencv&#xff0c;参考我另外一篇文章https://blog.csdn.net/weixin_44733606/article/details/131720128。 一、安装VS2022&…

实现组件动画的时候报这个错误

vue3 Component inside &#xff1c;Transition&#xff1e; renders non-element root node that cannot be animated. 然后怎么解决的,在template元素里面放了多个节点所以报这个错误,我们先写一个div里面写就可以解决 <template><div><el-card>123</…

夜视成像应用激光照明方法

在夜视成像领域&#xff0c;激光照明的使用主要集中在提高成像质量和远距离观察上。 以下是几种用于夜视成像的激光照明方法&#xff1a; 直接激光照明&#xff1a; 这种方法涉及直接用激光光束照射目标。激光器发出的光束可以是可见光或红外光&#xff0c;具体取决于应用需求和…