代码随想录二刷 |回溯 |分割回文串

代码随想录二刷 |回溯 |分割回文串

  • 题目描述
  • 解题思路
  • 代码实现

题目描述

131.分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]

解题思路

回溯三部曲

  • 递归函数参数
    全局变量数组path存放切割后回文的子串,二维数组result存放结果集

    参数还需要startIndex,因为切割过的地方不能重复切割。

    vector<string> path;
    vector<vector<string>> result;
    void backtracking(const string& s, int startIndex) 
    
  • 递归函数终止条件
    当切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止条件。

    在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。

    void backtracking (const string& s, int startIndex) {// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了。if (startIndex >= s.size()) {result.path_back(path);return;}
    }
    
  • 单层搜索的逻辑
    在循环中定义了起始位置startIndex,那么[startIndex, i]就是这个要截取的子串。

    首先判断这个子串是不是回文,如果是回文,就加入到vector<string> path中,path用来记录切割过的回文子串。

    for (int i = startIndex; i < s.size(); i++) {if (isPalindrome(s, startIndex, i)) { // 如果是回文子串// 获取[startIndex, i]在 s 中的子串string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else { // 如果不是则直接跳过continue;}backtracking(s, i + 1); // 寻找i + 1为起始位置的子串path.pop_back(); // 回溯过程,弹出本次已经添加的子串
    }
    

    接下来判断回文子串,使用双指针法,一个指针从前向后,一个指针从后向前,如果前后指针所指向的元素是相等的,就找到了回文字符串。

    bool isPalindrome(const string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {if (s[i] != s[j]) {return false;}}return true;
    }
    

代码实现

class Solution {
private:vector<vector<string>> result;vector<string> path;void backtracking(const string& s, int startIndex) {if (startIndex >= s.size()) {result.push_back();return;}for (int i = startIndex; i < s.size(); i++) {if (isPalindrome(s, startIndex, i)) {string str = s.substr(startIndex, i - stratIndex + 1);path.push_back(str);} else {continue;}backtracking(s, i + 1);path.pop_back();}}bool isPalindrome(const string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {if (s[i] != s[j])return false;}}return true;}
public:vector<vector<string>> partition(string s) {result.clear();path.clear();backtracking(s, 0);return result;}
};

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

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

相关文章

【服务器】安装Docker环境

目录 &#x1f33a;【前言】 &#x1f33c;1. 打开Xshell软件 &#x1f33b;2. 安装Docker环境 ①&#xff1a;下载docker.sh脚本 ②&#xff1a;列出下载的内容 ③&#xff1a;执行一下get-docker.sh文件&#xff0c;安装docker ④&#xff1a;运行docker服务 ⑤&…

openEuler操作系统安装+部署+配置

目录 一、下载 二、创建虚拟机实例 三、安装部署 四、配置OpenEuler22.03 1、登录账号 2、Xshell建立连接 3、关闭防火墙及SELinux 4、修改主机名修改root密码 5、配置yum源 6、查看网卡配置 7、用yum下载软件 8、网络配置 1&#xff09;nmtui --图形化界面配置 …

攸信UMS工业配送AMR F1引领智能物流发展,侨智大会瞩目焦点

近日&#xff0c;由中国侨联、福建省人民政府共同主办的第一届中国侨智发展大会在福州开幕。本次大会以“五洲聚‘福’汇侨智&#xff0c;同心共圆中国梦”为主题&#xff0c;立足福建、服务全国、面向海外&#xff0c;吸引了来自37个国家和地区的一千余名海内外嘉宾参会。 01|…

podman-desktop 镜像导入倒出,标签设置

镜像导入 podman load -i /work/redis-stack.tar路径文件&#xff1a; /work/redis-stack.tar 镜像导出 podman save 40bc1cc6182d > /work/redis-stack.tar 或 podman save docker.io/redis/redis-stack:7.2.0-v7 > /work/redis-stack.tar路径文件&#xff1a; /work…

98.乐理基础-记号篇-装饰音记号(六)倚音

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;97.乐理基础-记号篇-装饰音记号&#xff08;五&#xff09;颤音-CSDN博客 从历史的发展上来讲&#xff0c;倚音本质上是分为短倚音 和 长倚音这两种类型&#xff0c;但是长倚音确实是一个目前看上去没有什么意义的…

火车票车票查询-Python

一、相关代码 # Time: 2024/1/22 20:24 # Author: 马龙强 # File: 实现12306查票购票.py # software: PyCharm """网址&#xff1a;https://www.12306.cn/index/ 数据&#xff1a;车次信息 查票链接&#xff1a;https://kyfw.12306.cn/otn/leftTicket/queryE?…

Java算法 leetcode简单刷题记录2

Java算法 leetcode刷题记录2 最后一个字母长度&#xff1a; https://leetcode.cn/problems/length-of-last-word/ str.trim() 去掉开头结尾空格&#xff1b;不会去掉中间空格&#xff1b; 搜索插入位置&#xff08;有序的数列&#xff0c;2分查找法&#xff09;&#xff1a;ht…

P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two题解

题目 两只牛逃跑到了森林里。Farmer John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为&#xff08;牛和John&#xff09;。 追击在1010的平面网格内进行。一个格子可以是&#xff1a;一个障碍物&#xff0c;两头牛&#xff08;它们总在一起&#xff09;&#x…

20.有效的括号(附带源码)

目录 一、思路 二、源码 一、思路 左括号入栈&#xff0c;遇到右括号则出栈进行匹配。 1、如果不匹配&#xff0c;false 2、如果匹配完&#xff0c;栈不空&#xff0c;false 3、如果栈空&#xff0c;但是还有右括号&#xff0c;false 二、源码 // 支持动态增长的栈 typed…

常用界面设计组件 —— 数字输入和显示组件

2.3 数字输入和显示组件2.3.1 QSpinBox 与 QDoubleSpinBox2.3.2其它数值输入和显示组件 2.3 数字输入和显示组件 2.3.1 QSpinBox 与 QDoubleSpinBox QSpinBox用于整数的显示和输入&#xff0c;一般显示十进制 数&#xff0c;也可以显示二进制、十六进制数&#xff0c;而且可以…

GEE错误——Image (Error) Image.select: Pattern ‘SR_B1‘ did not match any bands.

错误 我花了大量时间试图解决这个问题,但我找不到解决办法。开发人员和小组成员,我需要你们的帮助,这是我学习项目的一部分。 原始代码链接: https://code.earthengine.google.com/ccd8eb582aa520b970f4dee2d5118def Image (Error) Image.select: Pattern SR_B1 did …

02 MyBatisPlus核心功能之基于Mapper接口/Service接口实现CRUD+分页查询

项目结构&#xff1a; 1.1 Insert方法 // 插入一条记录 // T 就是要插入的实体对象 // 默认主键生成策略为雪花算法&#xff08;后面讲解&#xff09; //返回值是影响条数 int insert(T entity);1.2 Delete方法 // 根据 entity 条件&#xff0c;删除记录 int delete(Param(…

Python学习03—Python语法元素分析

一、程序的格式框架 1.1 代码高亮 代码高亮是Python编程环境根据代码不同含义&#xff0c;给予不同色彩标注的一种色彩辅组体系。在不同的代码编程环境中&#xff0c;代码高亮的表现形式各有不同。 1.2 缩进 缩进是一行代码开始前的空白区域&#xff0c;它用来表达程序的格式…

不同知识表示方法与知识图谱

目录 前言1 一阶谓词逻辑1.1 简介1.2 优势1.3 局限性 2 产生式规则2.1 简介2.2 优势2.3 局限性 3 框架系统3.1 简介3.2 优势3.3 局限性 4 描述逻辑4.1 简介4.2 优势4.3 局限性 5 语义网络5.1 简介5.2 优势5.3 局限性 结语 前言 知识表示是人工智能领域中至关重要的一环&#x…

vue3前端开发,生命周期函数的基础练习

vue3前端开发,生命周期函数的基础练习&#xff01; 下面先给大家看一个图片&#xff0c;帮助大家了解&#xff0c;vue3的生命周期函数&#xff0c;和旧版本vue2的生命周期函数&#xff0c;有什么变化。 如图所示&#xff0c;vue3里面&#xff0c;把前面2个函数&#xff0c;混在…

再不学Python就晚了!——2023年度总结:市场需求最大的8种编程语言!

众所周知&#xff0c;编程语言的种类实在是太多了。直到现在&#xff0c;经常还会看到关于编程语言选择和学习的讨论。 虽说编程语言有好几百种&#xff0c;但实际项目使用和就业要求的主流编程语言却没有那么多。 大家可能也会好奇&#xff1a;现如今就业市场上到底什么编程…

【C++】Qt:QCustomPlot图表绘制库配置与示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍QCustomPlot图表绘制库配置与示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

【网站项目】新冠疫情隔离人员信息管理系统(有源码)

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板,帮助书写开题报告。作者完整代码目录供你选择: 《Springboot网站项目…

kingbase常用SQL总结之锁等待信息

锁信息与等待事件 分析kingbase&#xff08;pg&#xff09;数据库锁等待、死锁时需要我们准确的定位等锁或者死锁相关的事务。关于获取锁等待信息或者死锁信息已有经典的SQL可以直接使用&#xff0c;但是需要我们先了解sql语句获取的每个字段的意义。 获取到锁等待事务不能完全…

C++之函数名后面的const

在 C 中&#xff0c;函数名后面加上const 关键字表示该函数不会修改对象的成员变量(除非成员变量是mutable的)。这是一种良好的编程习惯&#xff0c;可以提高代码的安全性和可读性。 在这个例子中&#xff0c;internalWinId() 和 effectiveWinId() 都被声明为 const,这意味着它…