代码随想录day24--回溯的应用3

LeetCode93.修复IP地址

题目描述:
 

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

解题思路:

·这题和之前的131.分割回文串的题目是类似的,需要意识到这是一个切割问题,这就可以使用回溯法将这题解出

·再与上题的抽象树的过程一致,如图:

·但是加入题解中的条件不一样,需要一个pointNum,记录添加逗号的数量,如果pointNum为3说明字符串分成了四段,再创造一个isVaild函数,验证一下每段字符串是否合法,即可将其加入到结果集中。

代码如下:

class Solution {
public:vector<string> result;bool isVaild(const string& s,int start,int end){if(start > end) return false;if(s[start] == '0' && start != end) return false;//0开头的数字不合法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) return false;//大于255不合法}return true;}void backtracking(string& s,int startIndex,int pointNum){if(pointNum == 3){//逗号数量为3,分割结束if(isVaild(s,startIndex,s.size()-1)){// 判断是否合法,合法就放入result中result.push_back(s);}return ;}for(int i = startIndex;i < s.size();i++){if(isVaild(s,startIndex,i)){//判断[startInde,i]这个区间中的子串是否有效s.insert(s.begin()+i+1,'.');//在i后插入一个逗号pointNum++;backtracking(s,i+2,pointNum);//向下一个子串递归pointNum--;s.erase(s.begin()+i+1);//回溯删掉逗号}else break;}}vector<string> restoreIpAddresses(string s) {if(s.size() < 4 || s.size() > 12) return result;backtracking(s,0,0);return result;}   
};

·时间复杂度:O(3^4),IP地址最多包含四个数字,每个数字最多有3种可能的分割方式,则搜索树最大深度为4,每个节点最多有3个子节点

·空间复杂度:O(n)

·总结:思想与上一题是基本一样的,难点也是一样的,可以说是分割回文串的加强版

个人感觉比较难的点还是如何操作字符串添加逗号作为分隔符,并验证区间的合法性

LeetCode78.子集

题目描述:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

解题思路:

·这题与之前的组合问题并不一样,如果把子集问题、组合问题、分割问题都抽象为一棵树,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

·子集也是一个组合问题,{1,2}和{2,1}一样的,所以去组合问题一样都是从startIndex开始。

将问题也抽象成树型结构,如图:

·从图中可以看出与之前的,需要将所有的接待你都记录下,就可以将要求的子集得出。

代码如下:

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums,int startIndex){result.push_back(path);//收集子集,要在最前面,否则会将最后一个漏掉if(startIndex >= nums.size()) return ;for(int i = startIndex;i < nums.size();i++){path.push_back(nums[i]);backtracking(nums,i+1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums,0);return result;}
};

·时间复杂度:O(n*2^n)

·空间复杂度:O(n)

易错点:

·将组合问题和分割问题,与子集问题概念混淆,组合问题和分割问题都素收集树的叶子节点,而子集问题是找到树的所有节点

·如之前的题解图中可知道,之前的题目中,都有限制条件,以及剪枝条件,而本题并没有

LeetCode90.子集

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

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

相关文章

Chapter 8 - 15. Congestion Management in TCP Storage Networks

User Actions After learning the states of queue utilization, the following are the actions that admins and operators can take while using TCP transport for storage traffic. 了解了队列利用率的状态后,管理员和操作员在使用 TCP 传输存储流量时可以采取以下措施。…

使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

原文&#xff1a; Losasso, Frank, Frdric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462. 引言 这篇文章扩展了 [Popinet 2003] 的工作&#xff0c;拓展到表面自由流&#xff0c;并且使…

Oracle 基础入门指南

一、什么是Oracle&#xff1f; Oracle是一款由美国Oracle公司开发的关系型数据库管理系统。它支持SQL查询语言&#xff0c;并提供了丰富的功能和工具&#xff0c;用于管理大规模数据存储、处理和访问。Oracle被广泛应用于企业级应用中&#xff0c;包括金融、电信、零售等各行各…

第12章 反射

12.1 反射概述 Java的反射&#xff08;reflection&#xff09;机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以得到任意一个对象所属的类的信息&#xff0c;可以调用任意一个类的成员变量和方法&#xff0c;可以获取任意一个对象的属性和方法…

突破编程_C++_高级教程(多线程编程实例)

1 生产者-消费者模型 生产者-消费者模型是一种多线程协作的设计模式&#xff0c;它主要用于处理生产数据和消费数据的过程。在这个模型中&#xff0c;存在两类线程&#xff1a;生产者线程和消费者线程。生产者线程负责生产数据&#xff0c;并将其放入一个共享的数据缓冲区&…

Java中 ConcurrentSkipListSet和ConcurrentSkipListMap的区别

ConcurrentSkipListSet和ConcurrentSkipListMap之间有什么区别 ConcurrentSkipListSet和ConcurrentSkipListMap都是Java并发包java.util.concurrent中的类&#xff0c;它们都使用"Skip List"&#xff08;跳表&#xff09;数据结构。跳表是一种随机化数据结构&#x…

【nginx实践连载-1】安装部署配置初始化

要在Ubuntu上安装、部署和配置Nginx&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤1&#xff1a;安装Nginx 打开终端&#xff08;Terminal&#xff09;。运行以下命令更新软件包索引&#xff1a;sudo apt update安装Nginx&#xff1a;sudo apt install nginx步骤2&a…

Python常见的字符串格式化

Python中字符串格式化有多种方式&#xff0c;以下是其中常用的几种&#xff1a; 使用%进行格式化&#xff1a;类似于C语言中的printf方式。 name "Alice" age 11 message "Hello, %s! You are %d years old." % (name, age) print(message)使用format()…

js---webAPI

01 声明变量 js组成&#xff1a; DOM:操作网页内容的,开发页面内容特效和实现用户交互 BOM: DOM树&#xff1a;将 HTML 文档以树状结构直观的表现出来&#xff0c;我们称之为文档树或 DOM 树 文档树直观的体现了标签与标签之间的关系 CSS获取元素的方法 document.querySele…

态、势、感、知的偏序、全序与无序

在态势感知中&#xff0c;"态"、"势"、"感"和"知"可以被理解为描述不同层次的概念。而在偏序、全序和无序方面&#xff0c;它们可以有不同的关系&#xff0c;简单地说&#xff0c;偏序关系表示部分的可比较性&#xff0c;全序关系表示…

精品springboot基于大数据的电脑主机硬件选购助手-可视化大屏

《[含文档PPT源码等]精品基于springboot基于大数据的电脑主机硬件选购助手[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&a…

Cron表达式选择器

Cron表达式选择器 功能描述 Cron表达式选择器是用于定时任务调度的一种常见工具&#xff0c;通常用于指定任务的执行时间。Cron表达式由一系列时间单位和对应的时间值组成&#xff0c;用于指定任务的执行时间。下面是一个Cron表达式的示例 0 0 12 * * ?这个表达式的含义是每…

有一台阿里云轻量应用服务器可以用来做什么?

阿里云轻量应用服务器可以用来做什么&#xff1f;轻量服务器可用于网站搭建、个人博客、图床、云端学习环境、电商建设、论坛社区、开发环境配置等。可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动信息。 轻量是不是性能差&#xff1f;不是&#xff0c;轻量应用…

电阻器的脉冲浪涌能力?

由于现有需求&#xff0c;许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护&#xff0c;尤其是在电机控制器等电路中。当电机启动时&#xff0c;此时消耗的电流过大&#xff0c;可能导致电阻器故障。同样&#xff0c;如果电容器用于电机…

洛谷: P1480 A/B Problem

题目描述 输入两个整数 a , b a,b a,b&#xff0c;输出它们的商。 输入格式 两行&#xff0c;第一行是被除数&#xff0c;第二行是除数。 输出格式 一行&#xff0c;商的整数部分。 样例 #1 样例输入 #1 10 2样例输出 #1 5提示 0 ≤ a ≤ 1 0 5000 0\le a\le 10^{500…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱13(附带项目源码)

效果演示 文章目录 效果演示前言每次丢弃一个物品源码完结前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机…

MySQL性能分析1

1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次&#xff0c;得到当前数据库是以插入&#xff0c;更新和删除为主还是以查询为主&#xff0c;如果是以插入&#xff0c;更新和删除为主的话&#xff0c;那么优化比重可以轻一点儿。 语法&#xff1a; …

Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按照输入点顺序连曲线

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136131310 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

c入门第十九篇: 易错的指针操作(代码的调试)

前面讲述到了链表的操作&#xff0c;链表具有动态伸缩的优点&#xff0c;但是链表是指针操作&#xff0c;必然面临着指针操作的诸多问题&#xff0c;比如典型的空指针操作问题&#xff0c;出现问题之后&#xff0c;除了printf&#xff0c;还有没有其他方法调试呢&#xff1f; …

leetcode热题100. 字母异位词分组

Problem: 49. 字母异位词分组 文章目录 题目思路复杂度Code 题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”…