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

news2024/10/7 16:27:07

93.复原IP地址

题目链接:93.复原IP地址

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 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 中的任何数字。你可以按 任何 顺序返回答案。

文章讲解/视频讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html

思路

这道题和分割回文串有相似之处,同样采用回溯来解决。回溯的横向遍历是确定每层的分隔位置,纵向遍历则是递归地确定下一个分隔的位置。

首先确定回溯函数的参数:代表当前分隔的组合path,当前遍历到的下标starti。

确定结束条件:当starti遍历到字符串s末尾,或组合中的元素个数达到了四个。其中若同时满足这两个条件,将组合中的元素合成一个IP地址,加入结果。

遍历:横向遍历确定每层的分隔位置,纵向遍历则递归地确定下一个分隔的位置。对于每个分隔位置,判断从starti到该位置能否构成一个合法的IP字段,如果是,则可以纵向递归地向下遍历。

C++实现

class Solution {
public:
    vector<string> results;

    vector<string> restoreIpAddresses(string s) {
        vector<string> path;
        backtracing(path, 0, s);
        return results;
    }

    void backtracing(vector<string>& path, int starti, const string& s){
        if(starti == s.size() || path.size() == 4){
            if(starti == s.size() && path.size() == 4){
                string tmp;
                for(int i = 0;i<path.size();i++){
                    tmp += path[i];
                    if(i < path.size() - 1) tmp += ".";
                }
                results.push_back(tmp);
            }
            return;
        }

        for(int j = starti;j<s.size() && j < starti + 3;j++){ // 剪枝
            if(isvalid(s, starti, j)){
                path.push_back(s.substr(starti, j - starti + 1));
                backtracing(path, j + 1, s);
                path.pop_back();
            }
        }
    }

    bool isvalid(const string& s, int left, int right){
        // 判断前导0
        if(s[left] == '0'){
            if(right > left) return false;
        }

        int num = stoi(s.substr(left, right - left + 1));
        return num >= 0 && num <= 255;
    }
};

78.子集

题目链接:78.子集

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

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

文章讲解/视频讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html

思路

利用回溯来处理,这里横向遍历是遍历加入当前元素和不加入当前元素两种情况,纵向遍历是递归地寻找下一个元素。

回溯函数的参数:当前已加入的元素集合path,当前遍历到的元素下标starti。

回溯函数的终止条件:很简单,starti等于nums.size(),即遍历到原数组末尾。

回溯函数的遍历:每一层的横向遍历,遍历判断加入当前元素和不加入当前元素两种情况,纵向遍历是递归寻找下一个元素。

看了卡哥的教程之后,知道了原来可以把子集问题想成收集树的所有节点。如下图,相当于在遍历这样一棵树的时候,将节点的值全部存入结果中。

在这里插入图片描述

C++实现

class Solution {
public:
    vector<vector<int>> results;
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> path;
        backtracing(path, 0, nums);
        return results;
    }

    void backtracing(vector<int>& path, int starti, const vector<int>& nums){        
        if(starti == nums.size()){
            results.push_back(path);
            return;
        }
        // 不加入i元素
        backtracing(path, starti + 1, nums);
        // 加入i元素
        path.push_back(nums[starti]);
        backtracing(path, starti + 1, nums);
        path.pop_back();
    }
};

// 另一种思路
class Solution {
public:
    vector<vector<int>> results;
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> path;
        backtracing(path, 0, nums);
        return results;
    }

    void backtracing(vector<int>& path, int starti, const vector<int>& nums){   
        results.push_back(path);     
        if(starti == nums.size()){
            return;
        }
        for(int i = starti;i<nums.size();i++){
            path.push_back(nums[i]);
            backtracing(path, i + 1, nums);
            path.pop_back();
        }
    }
};

90.子集II

题目链接:90.子集II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

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

文章讲解/视频讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html

思路

采用和上题一样的,遍历整棵树,将树的节点存入结果中的思路。本题多了一点,需要去重。

去重的思路:先把原数组nums排好序,然后回溯函数的每一层在遍历时,判断当前遍历的值和上一个遍历的值是否相等,如果相等则跳过。

C++实现

class Solution {
public:
    vector<vector<int>> results;
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<int> path;
        backtracing(path, 0, nums);
        return results;
    }

    void backtracing(vector<int>& path, int starti, const vector<int>& nums){
        results.push_back(path);
        if(starti == nums.size()) return;

        for(int i = starti;i<nums.size();i++){
            if(i > starti && nums[i] == nums[i - 1]) continue; // 去重
            path.push_back(nums[i]);
            backtracing(path, i + 1, nums);
            path.pop_back();
        }
    }
};

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

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

相关文章

网站如何创建百度地图显示地理位置

在做企业网站的时候&#xff0c;我们会放置一个地理位置&#xff0c;我们可以引用百度地图&#xff0c;来显示我们的店铺所在位置 效果演示&#xff1a; 操作步骤 1、打开百度地图https://map.baidu.com/&#xff0c;搜索输入地址 2、点击地址 3、会出现如下视图 4、点击分享…

typora导出html添加目录

typora导出html添加目录 使用方法 首先要从typora导出html文件&#xff0c;之后用记事本编辑器html文件 找到文档最后面&#xff0c;如图&#xff1a; 用文字编辑类工具打开sideBar.txt&#xff0c;复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

计算机体系结构动态调度(计分板及Tomasulo)学习记录

1.动态调度核心思想&#xff1a;允许就绪指令越过前方停顿指令&#xff0c;提前进入运行&#xff08;乱序执行&#xff09; 就绪指令指不存在资源冲突、操作数已就绪的指令&#xff0c;例如&#xff0c;计分板算法使用计分板来实现&#xff0c;Tomasulo使用保留站来实现&#…

白灯和黄灯哪个更保护视力?安利保护视力的护眼台灯

现代社会&#xff0c;人们的生活和工作都离不开电子产品&#xff0c;长时间面对电脑、手机等设备造成的眼睛疲劳和视力衰退的问题也愈发普遍。为此&#xff0c;护眼台灯应运而生&#xff0c;旨在为用户提供更加舒适、健康的光源&#xff0c;减少对眼睛的伤害&#xff0c;同时提…

pytorch09:可视化工具-TensorBoard,实现卷积核和特征图可视化

目录 一、TensorBoard简介二、TensorBoard安装三、TensorBoard运行可视化四、TensorBoard详细使用4.1 SummaryWriter4.2 add_scalar()4.3 add_scalars()4.4 add_histogram()4.4.1实际项目开发使用 4.5 add_image()4.6 torchvision.utils.make_grid4.7 卷积核和特征图可视化4.7.…

IntelliJ IDEA开发工具常规设置、插件、快捷键、Debug和集成工具一篇快速入门

文章目录 常规设置同步设置快捷键&#xff08;Windows&#xff09;搜索层级关系查看光标选择代码定位代码操作Git操作编辑器操作 Debug操作集成本地Git集成本地Maven集成本地Tomcat实用插件 版本说明&#xff1a; 注意&#xff1a;若和上面的IDEA版本差异较大&#xff0c;可能存…

第二证券:主力为什么要砸盘?

砸盘就是在股票的某个阶段有许多卖出单&#xff0c;这些许多的卖出单不断的成交使股票价格出现快速下跌。一般是受到主力资金洗盘或者出货所影响形成的。 1、洗盘 个股通过长时间上涨之后&#xff0c;盘中的散户较多&#xff0c;主力为了洗掉盘中的散户&#xff0c;在低位吸筹…

Android性能优化系列——APK包优化

业务功能开发完之后&#xff0c;就需要对App打包了。 有时候明明功能不多&#xff0c;但是包体很大&#xff0c;一是影响上架&#xff0c;二是就几个功能但是很大心里会膈应&#xff0c;于是包体有时候也需要进行优化。同类型的竞品只要40m,你要200M&#xff0c;那我肯定愿意先…

性能分析与调优: Linux 内存观测工具

目录 一、实验 1.环境 2.vmstat 3.PSI 4.swapon 5.sar 6.slabtop 7.numstat 8.ps 9.top 10.pmap 11.perf 12.bpftrace 二、问题 1.接口读写报错 2.slabtop如何安装 3.numactl如何安装 4.numad启动服务与关闭NUMA 5. perf如何安装 6. kernel-lt-doc与kern…

【卡梅德生物】稳定细胞系构建的原理及流程

稳定细胞株构建的基本原理&#xff1a; 首先改造原始细胞基因组&#xff0c;通过基基因编辑工具&#xff0c;使改造后的细胞拥有某些特定表型&#xff0c;并经过抗性筛选或其他筛选方法&#xff0c;使其表型能够长期稳定传代。 构建稳定细胞株的实验流程&#xff1a; 首先将外源…

外贸企业建站步骤有哪些?海洋建站怎么做?

外贸企业建站平台推荐&#xff1f;做外贸如何搭建贸易网站&#xff1f; 外贸企业要想在激烈的市场竞争中立于不败之地&#xff0c;建立一个专业而吸引人的网站是至关重要的一环。海洋建站将深入探讨外贸企业建站的关键步骤&#xff0c;为您提供一个清晰的指南&#xff0c;助您…

Spring - 配置支持多数据源

目录 SpringBoot整合多数据源整合步骤具体整合步骤如下&#xff1a;1、在application.properties中配置出多个数据源2、在代码中创建出mapper目录&#xff0c;在mapper目录下创建出不同数据源的目录创建出目录MySQL数据源的MapperSQL Server数据源的Mapper 3、创建config packa…

(N-138)基于springboot,vue在线教育平台

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredis…

vue3 封裝一个常用固定按钮组件(添加、上传、下载、删除)

效果图 这个组件只有四个按钮&#xff0c;添加&#xff0c;上传、下载、删除&#xff0c;其中删除按钮的颜色默认是灰色&#xff0c;当表格有数据选中时再变成红色 实现 组件代码 <script lang"ts" setup> import { Icon } from /components/Icon/index im…

web提示框属性的运用

效果展示&#xff1a; 注意事项&#xff1a; 引用JQuery文件地址和图片地址要更换一下。提示框属性的宽应该和图片的宽保持一致。 html/css/javascript页面代码&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <tit…

选择排序!!!基础排序详解 C语言版

目录 1.什么是选择排序 2.选择排序源代码 3.优化代码 1.什么是选择排序 这是一个选择排序的流程图&#xff0c;其实很简单&#xff0c;就是每次挑选数字中最小的作为第一个 &#xff0c;直到整个数据有序就结束了 顾名思义&#xff0c;选择&#xff0c;那就是选取&#xff0c…

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML&#xff1f; QML是一种用户界面规范和编程语言。它允许开发人员…

LiveGBS流媒体平台GB/T28181功能-操作日志如何配置保留天数过滤记录的日志根据操作名称过滤记录日志

LiveGBS功能操作日志菜单如何配置保留天数过滤记录的日志根据操作名称过滤记录日志 1、操作日志2、配置保留天数3、配置不记录操作日志3.1、不记录所有3.2、不记录指定操作名称 4、相关问题4.1、级联操作日志筛选 5、搭建GB28181视频直播平台 1、操作日志 LiveGBS操作日志菜单…