回溯分割+子集篇--代码随想录算法训练营第二十二天| 131.分割回文串,93.复原IP地址,78.子集,90.子集II

news2024/11/16 7:02:02

131.分割回文串

题目链接:. - 力扣(LeetCode)

讲解视频:131.分割回文串

题目描述:

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

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

解题思路:

深度:由当前字符串所含字母个数决定。当递归至字符串末尾即startIdx==字符串s长度时返回

宽度:由当前字符串所含字母个数决定。使用startIdx和i来确定子串范围。若子串不是回文串,就continue

 

代码:

class Solution {
public:
    vector<vector<string>> result;
    vector<string> path;
    bool isPalindromicString(string sub)
    {
        for(int i = 0, j = sub.size()-1; i<j; i++,j--)
            if(sub[i] != sub[j]) return false;
        return true;
    }
    void Backtracking(string s, int startIdx)
    {
        if(startIdx == s.size())
        {
            result.push_back(path);
            return;
        }
        for(int i = startIdx; i < s.size(); i++)
        {
            string sub = s.substr(startIdx,i - startIdx + 1);
            if(isPalindromicString(sub))
            {
                path.push_back(sub);
            }
            else continue;
            Backtracking(s,i+1);
            path.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        Backtracking(s,0);
        return result;
    }
};

93.复原IP地址

题目链接:. - 力扣(LeetCode)

讲解视频:

回溯算法如何分割字符串并判断是合法IP?| LeetCode: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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

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

示例 2:

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

解题思路:

深度:以‘.’的个数作为深度,最多3个‘.’,深度最大为3(根深度为0)

宽度:本题中宽度最多为3。而且截取出的数需满足题目要求

剪枝:同一层中当子串满足如下任意一个条件时该层就停止遍历:

  1. 以0开头且长度不为1
  2. 长度>=3且值超过255

代码:

class Solution {
public:
    vector<string> result;
    bool isValid(string s, int start, int end)
    {
        if(start > end) return false;
        if(s[start] == '0' && start != end) return false;
        int sum = 0;
        for(int i = start; i <= end; i++)
        {
            char c = s[i];
            if(c < '0' || c > '9') return false;
            sum = sum*10 + (c - '0');
            if(sum > 255) return false;
        }
        return true;
    }

    void backTracking(string& s, int startIdx, int pointSum)
    {
        if(pointSum == 3)
        {
            if(isValid(s,startIdx, s.size()-1)) result.push_back(s);
            return;
        }
        for(int i = startIdx; i < s.size(); i++)
        {
            if(isValid(s,startIdx,i))
            {
                s.insert(s.begin()+i+1,'.');
                pointSum++;
                backTracking(s,i+2,pointSum);
                pointSum--;
                s.erase(s.begin()+i+1);
            }
            else break;
        }
    }
    vector<string> restoreIpAddresses(string s) {
        result.clear();
        if(s.size() < 4 || s.size() > 12) return result;
        backTracking(s,0,0);
        return result;
    }
};

78.子集

题目链接:. - 力扣(LeetCode)

讲解视频:

回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集

题目描述:

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

示例 1:

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

示例 2:

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

解题思路:

与分割题类似,唯一不同点在于该题目除根节点以外的节点都要保存,之前做的题只保存叶子节点

 

代码:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backTracking(vector<int>& nums, int startIdx)
    {
        result.push_back(path);
        if(startIdx >= nums.size()) return ;
        for(int i = startIdx; i < nums.size(); i++)
        {
            path.push_back(nums[i]);
            backTracking(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        result.clear();
        backTracking(nums,0);
        return result;
    }
};

90.子集II

题目链接:. - 力扣(LeetCode)

讲解视频:

回溯算法解决子集问题,如何去重?| LeetCode:90.子集II

题目描述:

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

示例 1:

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

示例 2:

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

解题思路:

该题目是要在前一题的基础上增加去重操作,同一棵树相同元素不去重,不同子树同一层相同元素要去重。有如下两种方法:

  1. set去重-->根据set中不会保存重复元素的特点,对不同子树同一层重复元素进行去重
  2. used数组去重-->方法同回溯组合篇--代码随想录算法训练营第二十一天的40.组合总和II题

代码:

1、set方法 

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backTracking(vector<int>& nums, int startIdx)
    {
        result.push_back(path);
        if(startIdx >= nums.size()) return;
        unordered_set<int> isdup;
        for(int i =startIdx; i < nums.size(); i++)
        {
            if(isdup.find(nums[i]) != isdup.end()) continue;
            path.push_back(nums[i]);
            isdup.insert(nums[i]);
            backTracking(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        result.clear();
        path.clear();
        sort(nums.begin(),nums.end());
        backTracking(nums,0);
        return result;
    }
};

2、used数组判断法 

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backTracking(vector<int>& nums, int startIdx, vector<int>& used)
    {
        result.push_back(path);
        if(startIdx >= nums.size()) return;
        for(int i =startIdx; i < nums.size(); i++)
        {
            if(i > 0 && nums[i] == nums[i-1] && used[i-1] == 0) continue;
            path.push_back(nums[i]);
            used[i] = 1;
            backTracking(nums,i+1,used);
            used[i] = 0;
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<int> used(nums.size(),0);
        sort(nums.begin(),nums.end());
        backTracking(nums,0,used);
        return result;
    }
};

 

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

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

相关文章

2.3 Python 基本运算符

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

C++ STL专题 list的讲解

目录 1.list的介绍和使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.list的介绍和使用 1.1 list的介绍 1.list是可以在常数范围内任意位置进行插入和删除的序…

git系统学习

git系统学习 git命令行获取git 版本号 创建初始版本库创建git库初始化用户名和密码查看用户名和邮箱修改用户名和密码 将文件添加到版本库中删除暂存文件提交代码查看提交信息查看更加详细的信息查看提交差异版本库内文件的删除和重命名删除库里的文件重命名库里的文件 打标签查…

【RunnerGo】离线安装成功版本

目录 一、下载 二、解压安装包 三、修改安装配置 3.1 编辑修改安装参数&#xff08;我没有改&#xff0c;默认安装即可&#xff09; 3.2 安装目录结构说明 四、执行安装 五、检查服务并使用 六、访问 前言&#xff1a;最近在调研一个新工具&#xff0c;发现RunnerGo&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑通信-物理耦合的有源配网故障后协调恢复策略 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

SpringBoot banner 推荐

看看我这个怎么样 效果图 在resources下面创建一个banner.txt&#xff0c;把下面代码放到进去就可以用了 ${AnsiColor.GREEN} Application Version: ${ruoyi.version} Spring Boot Version: ${spring-boot.version}69696969 696969696969 696969 …

Facebook的技术创新:如何改变社交网络的面貌

Facebook作为全球最大的社交网络平台之一&#xff0c;一直在不断推动技术创新&#xff0c;以提升用户体验和社交互动质量。这些技术创新不仅改变了人们的社交方式&#xff0c;也深刻影响了整个社交网络的面貌。 人工智能驱动的内容推荐 Facebook利用人工智能&#xff08;AI&am…

深圳市光明区副区长彭颖一行莅临立仪科技参观考察

2024年8月5日上午&#xff0c;‌深圳市光明区彭颖副区长一行领导莅临深圳立仪科技有限公司调研指导工作&#xff0c;深圳市智能传感行业协会执行会长姜勇以及协会秘书长张喻陪同调研。我公司总经理刘杰波、以及各部门负责人陪同参加。 彭颖副区长一行领导在刘总的接待和讲解下&…

vue实现页面中点击预览报告,实现将vue组件变成pdf文件进行弹窗展示

一.实现效果 页面中点击预览报告&#xff0c;实现将vue组件变成pdf文件进行弹窗展示 定义的方法文件 import html2canvas from "html2canvas"; import jsPDF, { RGBAData } from "jspdf";/** a4纸的尺寸[595.28,841.89], 单位毫米 */ const [PAGE_WIDT…

微深节能 环形运动机械定位控制系统 格雷母线

格雷母线定位系统作为一种高精度、无磨损的非接触式位置检测系统&#xff0c;特别适用于环形运动机械的定位控制。 一、格雷母线定位系统的概述 格雷母线定位系统主要由一台地面电气柜、一台车载电气柜、格雷母线以及天线箱等组成。其核心部件是格雷母线&#xff0c;一种特殊的…

深度学习人脸表情识别结课作业留存

0.前言 大三下学期学习了深度学习神经网络的课程&#xff0c;老师留下了人脸表情识别的结课作业&#xff0c;在网上找到了一个想相对不错的开源项目作为基础完成了本次的结课作业。 1.项目链接 Challenges in Representation Learning: Facial Expression Recognition Chall…

运动耳机怎么选?来看看奥运冠军喜欢的运动耳机!

在奥运的竞技舞台上&#xff0c;每一次心跳的跃动都是对自我极限的勇敢挑战&#xff0c;运动员的每一个动作背后&#xff0c;都承载着不懈的努力与对梦想的执着追求。如今&#xff0c;运动科技正以前所未有的速度改变着我们的运动方式&#xff0c;一款优秀的运动耳机成为了连接…

Prompt Fuzzer:用于增强 GenAI 应用程序的开源工具

Prompt Fuzzer 是一个开源工具&#xff0c;可以评估GenAI应用程序的系统提示针对基于动态 LLM 的威胁的安全性。 Prompt Fuzzer 功能&#xff1a; 1. 模拟十几种类型的 GenAI 攻击。 2. 该工具会根据系统提示自动进行情境化&#xff0c;针对与 GenAI 应用程序相关的特定主题或行…

【Python机器学习】回归——用线性回归找到最佳拟合直线

线性回归的优缺点&#xff1a; 优点&#xff1a;结果易于理解&#xff0c;计算上不复杂 缺点&#xff1a;对非线性的数据拟合不好 使用数据类型&#xff1a;数值型和标称型数据。 回归的目的是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式。例如预测汽…

【C语言】预处理详解(上)

文章目录 前言1. 预定义符号2. #define 定义常量3. #define定义宏4. 带有副作用的宏参数5. 宏替换的规则 前言 在讲解编译和链接的知识点中&#xff0c;我提到过翻译环境中主要由编译和链接两大部分所组成。 其中&#xff0c;编译又包括了预处理、编译和汇编。当时&#xff0c…

【Windows系统开机后识别不到屏幕适配的分辨率导致屏幕无法点亮的解决办法】

问题原因分析&#xff1a; 屏幕驱动板出现故障&#xff0c;驱动出现缺失&#xff0c;未对主板系统进行适配兼容。使用的屏幕分辨率非常小众&#xff0c;系统中没有这个分辨率&#xff0c;识别不到屏幕适配的分辨率后导致屏幕无法点亮。 解决方法&#xff1a; 找主板厂家增加…

CVE-2022-33891漏洞复现

简介 Spark 是用于大规模数据处理的统一分析引擎。它提供了 Scala、Java、Python 和 R 中的高级 API&#xff0c;以及支持用于数据分析的通用计算图的优化引擎。它还支持一组丰富的高级工具&#xff0c;包括用于 SQL 和 DataFrames 的 Spark SQL、用于 Pandas 工作负载的 Spar…

【每日刷题】Day94

【每日刷题】Day94 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 33. 搜索旋转排序数组 - 力扣&#xff08;LeetCode&#xff09; 2. 1290. 二进制链表转整数 - 力扣…

科普文:微服务之万字详解分布式事务原理、协议及其框架

一、分布式事务 首先奉上一张关于事务的相关概念图&#xff0c;给大家做个总览&#xff1a; 1.1 名词解释 事务&#xff1a;事务是由一组操作构成的可靠的独立的工作单元&#xff0c;事务具备ACID的特性&#xff0c;即原子性、一致性、隔离性和持久性。本地事务&#xff1a;当…

树莓派4B部署及测试llamafile

llamafile项目简介 很多初学者学习大语言模型的时候,都会被模型文件中一大堆复杂的python文件或者cuda配置劝退,为了方便更多的零基础的初学者体验大语言模型,llamafile 提出了单文件运行大模型的方案。 GitHub - Mozilla-Ocho/llamafile: Distribute and run LLMs with a…