代码随想录算法训练营第二十八天补|93.复原IP地址 ● 78.子集 ● 90.子集II

news2024/11/15 19:30:29

组合问题:集合内元素的组合,不同集合内元素的组合
分割问题:本质还是组合问题,注意一下如何分割字符串

回溯模板伪代码

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

93.复原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 中的任何数字。你可以按 任何 顺序返回答案。

关键点

判断地址是否有效
集合内同一元素不可重复选取

思路

仍然是一个集合内元素的组合问题
backtracking(s, i + 2);是i+2,而非i+1,首先是不能重复所以应该i+1,但实际操作插入了’.',所以应该是i+2

  • 横向遍历是针对当前字符集合,遍历该集合的所有字符作为截取点
  • 纵向遍历是针对截取后得到的子字符集合(不可重复选取,故下一层子集不包含上层取的元素:上层截取点其右边所有元素)
    在这里插入图片描述

代码

class Solution {
public:
    vector<string> result;
    int partNum = 0;

    bool IsValid(const string &s, int begin, int end) {
        if(end - begin > 2 || end < begin) return false;

        int num = 0;
        for(int i = begin; i <=end; i++) {
            if(s[begin] == '0' && begin != end) return false; //不能含有前导 0 以及最后第四个整数不为空
            if(s[i] < '0' || s[i] > '9') return false; // 必须数字
            num = num * 10 + (s[i] - '0');
            if(num > 255) return false;  //整数不能超过255
        }
        return true;
    }

    void backtracking(string &s, int startIndex) {
        if(partNum == 3) { // 已插入3个'.',若第四个整数有效则添加到结果集
            if(IsValid(s, startIndex, s.size()-1)) {
                result.push_back(s);
            }
            return;
        }
        int flag = false;
        for(int i = startIndex; i < s.size(); i++) {
            if(IsValid(s, startIndex, i)) {
                s.insert(s.begin() + i + 1 , '.');  //合法则插入'.'
                partNum++;
                backtracking(s, i + 2);
                s.erase(s.begin() + i + 1); //回溯
                partNum--;
            } else break; // 不合法,直接结束本层循环,因为本层后面的也必不可能合法了
        }
    }

    vector<string> restoreIpAddresses(string s) {
        result.clear();
        if(s.size() < 4 || s.size() > 12) return result; //剪枝

        backtracking(s, 0);
        return result;
    }
};

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

关键点

集合内同一元素不能被重复选取
子集问题是找树的所有节点

思路

组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!子集也是一种组合问题

  • 横向遍历是针对当前集合,遍历取当前集合的所有元素
  • 纵向遍历是针对取完元素得到的子集合,遍历下一个子集合 (不可重复选取,故下一层子集不包含上层取的元素:上层所取元素其右所有元素)

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>& nums, int startIndex) {
        if(startIndex > nums.size()) return;

        for(int i = startIndex; i < nums.size(); i++) {
            path.push_back(nums[i]); //把遍历的所有节点都添加
            result.push_back(path);
            backtracking(nums, i+1); //不可重复选取,故下一层子集不包含上层取的元素:上层所取元素其右所有元素
            path.pop_back();
        }
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        result.clear();
        result.push_back(path);
        backtracking(nums, 0);
        return result;
    }
};

90.子集II

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。

关键点

集合有重复元素
树层去重
集合内同一元素不能被重复选取

思路

元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同——>去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。
本质是一个组合问题,集合内同一元素不能被重复选取

  • 横向遍历是针对当前集合,遍历该字符集的所有元素(树层去重,将同层已取过的相同值的元素跳过)
  • 纵向遍历是针对取后得到的子集(集合内同一元素不能被重复选取)
    在这里插入图片描述
class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;

public:
    void backtracking(vector<int>& nums, int startIndex) {
        for(int i = startIndex; i < nums.size(); i++) {
            if(i != startIndex && nums[i] == nums[i-1]) continue;  // 不同解集间不能重复,在树层去重
            
            path.push_back(nums[i]); 
            result.push_back(path); //把遍历的所有节点都添加
            backtracking(nums, i+1);
            path.pop_back();
        }
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        result.clear();
        path.clear();
        result.push_back(path);
        sort(nums.begin(), nums.end());
        backtracking(nums, 0);
        return result;
    }
};

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

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

相关文章

使用Python,maplotlib绘制树型有向层级结构图

使用Python&#xff0c;maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

房贷计算器微信小程序原生语言

微信小程序: 房贷计算器 效果: 输入 300万 结果 还款明细 一共有3个页面 1、输入页面 2、结果页面 3、详情页面 1 index页面 index.wxml文件 <view class="text-black"><!--房屋总价--><view class="cu-bar bg-white solid-bottom"&…

Redis--事务机制的详解及应用

Redis事务的概念&#xff1a; Redis事务就是将一系列命令包装成一个队列&#xff0c;在执行时候按照添加的顺序依次执行&#xff0c;中间不会被打断或者干扰&#xff0c;在执行事务中&#xff0c;其他客户端提交的命令不可以插入到执行事务的队列中&#xff0c;简单来说Redis事…

Vue之监测数据的原理(对象)

大家有没有想过&#xff0c;为什么vue可以监测到数据发生改变&#xff1f;其实底层借助了Object.defineProperty&#xff0c;底层有一个Observer的构造函数 让我为大家简单的介绍一下吧&#xff01; 我用对象为大家演示一下 const vm new Vue({el: "#app",data: {ob…

Harbor 的安装及使用

Harbor 安装官网手册&#xff1a; https://goharbor.io/docs/2.10.0/install-config/download-installer/ Harbor 发布包地址&#xff1a; https://github.com/goharbor/harbor/releases 在部署harbor的前提下先安装docker 和 docker-compose 安装docker&#xff1a;https://d…

Opencv基础与学习路线

Opencv Opencv每一篇目具体&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 Opencv(5)平滑处理 具体Opencv相关demo代码欢迎访问我的github仓库&#xff08;包含python和c代码&#xff09; demo代码 文章目录 Opencv一…

<专利>机器人3D视觉快速定位抓取方法及系统

摘要&#xff0c;此专利无可用的关键技术信息&#xff0c;基本都是下面几句话反复说。。。 本发明提供了一种机器人3D快速定位抓取方法及系统&#xff0c; 包括&#xff1a; 通过高速的3D结构光成像对目标物体的表面轮廓进行扫描&#xff0c; 形成点云数据&#xff1b;对所述点…

idea 手动打 jar 包

1.在 File 中找到并点击 Project Structure 2.按图中高亮的部分依次点击 3.在 Main Class 处设置要打包的类&#xff0c;记得在 Directory for ... 处设置目录为根目录&#xff0c;设置好以后点击两次 OK 回到首页 4.在页面上方找到 Build &#xff0c;点击 Build Artifacts...…

蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险

资源限制 内存限制&#xff1a;64.0MB C/C时间限制&#xff1a;200ms Java时间限制&#xff1a;600ms Python时间限制&#xff1a;1.0s 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号。 输出格式 一个0~9的数。 样例输入 0 样…

基于React全栈Sora AI视频案例展示项目

花了一天时间基于React Next全栈开发的Sora AI 演示项目 Preview: https://sora.langchat.cn/ Github&#xff1a;https://github.com/tycoding/lang-sora 欢迎大家star、fork呀&#xff01; 这是一套完整的React & Next.js项目&#xff0c;包含前后端交互、路由、数据库…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

企业微信变更主体怎么改?

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

uniapp实战:父子组件对象数组传参

需求说明 1.父组件传参给子组件 1.1子组件中定义属性unitList 1.2 父组件中将data中的unitList传递给子组件 2.子组件向父组件传参 2.1子组件设置用户名文本框以及切换操作属性 2.2 子组件对应操作(文本输入以及按钮切换)添加自…

【学习笔记】深度学习实战 | LeNet

简要声明 学习相关网址 [双语字幕]吴恩达深度学习deeplearning.aiPapers With CodeDatasets 深度学习网络基于PyTorch学习架构&#xff0c;代码测试可跑。本学习笔记单纯是为了能对学到的内容有更深入的理解&#xff0c;如果有错误的地方&#xff0c;恳请包容和指正。 参考文献…

C# 获取类型 Type.GetType()

背景 C#是强类型语言&#xff0c;任何对象都有Type&#xff0c;有时候需要使用Type来进行反射、序列化、筛选等&#xff0c;获取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…

C++——模板详解

目录 模板 函数模板 显示实例化 类模板 模板特点 模板 模板&#xff0c;就是把一个本来只能对特定类型实现的代码&#xff0c;变成一个模板类型&#xff0c;这个模板类型能转换为任何内置类型&#xff0c;从而让程序员只需要实现一个模板&#xff0c;就能对不同的数据进行操…

2024年 前端JavaScript Web APIs 第二天 笔记

Web APIs 第二天 2.1 -事件监听以及案例 2.2 -随机点名案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

Git分布式版本控制系统——git学习准备工作

一、Git仓库介绍 开发者可以通过Git仓库来存储和管理文件代码&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库 仓库之间的运转如下图&#xff1a; commit&#xff1a;提交&#xff…