131. 分割回文串(力扣LeetCode)

文章目录

  • 131. 分割回文串
    • 题目描述
    • 回溯代码

131. 分割回文串

题目描述

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

回文串 是正着读和反着读都一样的字符串。

示例 1:

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

示例 2:

输入:s = “a”
输出:[[“a”]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

回溯代码

在此代码片段中,子字符串是通过递归函数 backtracking 来获取的。函数 backtracking 是一个回溯算法的实现,用于找到字符串 s 的所有可能的回文分割。回文分割是指将字符串分割成若干子串,使得每个子串都是回文的。

下面是 backtracking 函数在寻找子串时的详细过程:

  1. 函数 backtracking 接收原始字符串 s 和一个 startIndex 参数,该参数指示当前考虑的子串的起始位置。

  2. 在每一层递归中,函数通过循环从 startIndex 遍历到字符串 s 的末尾。

  3. 在每次迭代中,它通过调用 isPalindrome 函数来检查当前考虑的子串 s[startIndex, i] 是否是回文。

  4. 如果检测到子串是回文,使用 substr 方法从 s 中提取出回文子串。substr 方法的第一个参数是子串的起始位置,第二个参数是要提取的字符数。这里,提取的字符数计算为 i - startIndex + 1,表示从 startIndex 到 i(包含 i)的子串长度。

  5. 获取到的回文子串 str 被加入到临时路径 path 中。

  6. 然后,递归调用 backtracking 函数,在寻找剩余子串的新的回文分割方案,此时 startIndex 更新为 i + 1,因为 i 位置的字符已经包含在了当前找到的回文子串内。

  7. 递归返回后,执行 path.pop_back(),这是回溯的一部分,它将最后一个添加到 path 中的回文子串移除,以便 path 可以用于下一次循环迭代时的新的分割方案。

  8. 当 startIndex 大于或等于字符串 s 的长度时,意味着已经到达字符串的末尾,当前 path 中存储的回文子串序列即为 s 的一个有效分割,此时将 path 加入到 result 中。

通过这种方法,代码实现了在递归循环中对字符串进行子串的分割,并确保了每个分割方案中的所有子串都是回文的。

假设我们有一个字符串 s = “aab” 并且我们想要找到所有可能的回文分割方案。下面是 backtracking 函数在这个字符串上操作的示例:

  1. 初始调用 backtracking("aab", 0)startIndex 是 0,意味着我们从字符串的第一个字符开始。

  2. 第一层递归的循环从 i = 0 开始:

    a. 检查子串 s[0, 0]"a" 是否是回文 — 是,所以 path 变为 ["a"]

    b. 递归调用 backtracking("aab", 1) 查看从第二个字符开始的所有回文分割方案。

  3. 第二层递归开始,现在考虑的子串是 "ab"

    a. 循环从 i = 1 开始,检查子串 s[1, 1]"a" 是否是回文 — 是,所以现在 path 变为 ["a", "a"]

    b. 递归调用 backtracking("aab", 2) 查看从第三个字符开始的所有回文分割方案。

  4. 第三层递归开始,现在考虑的子串是 "b"

    a. 循环从 i = 2 开始,检查子串 s[2, 2]"b" 是否是回文 — 是,所以现在 path 变为 ["a", "a", "b"]

    b. 递归调用 backtracking("aab", 3),发现 startIndex 等于字符串长度,意味着找到了完整的一组分割方案。将其添加到 result 中,result = [["a", "a", "b"]]

    c. 回溯发生,path.pop_back() 移除最后一个元素 "b",现在 path = ["a", "a"]

  5. 返回到第二层递归,继续 i 的循环,现在 i = 2

    a. 检查子串 s[1, 2]"ab" 是否是回文 — 不是,所以不改变 path

    b. 循环结束,开始回溯,path.pop_back() 移除最后一个元素 "a",现在 path = ["a"]

  6. 返回到第一层递归,继续 i 的循环,下一次 i = 1

    a. 检查子串 s[0, 1]"aa" 是否是回文 — 是,所以 path 变为 ["aa"]

    b. 递归调用 backtracking("aab", 2) 查看从第三个字符开始的所有回文分割方案。

  7. 第四层递归开始,现在考虑的子串是 "b"

    a. 循环从 i = 2 开始,检查子串 s[2, 2]"b" 是否是回文 — 是,所以 path 变为 ["aa", "b"]

    b. 递归调用 backtracking("aab", 3),发现 startIndex 等于字符串长度,意味着找到了另外一个完整的一组分割方案。将其添加到 result 中,现在 result = [["a", "a", "b"], ["aa", "b"]]

  8. 回溯发生,path.pop_back() 移除 "b",回到 path = ["aa"]。然后第四层递归的循环结束,path.pop_back() 再次移除 "aa",回到 path = []

最终的 result 包含了所有可能的回文分割方案:[["a", "a", "b"], ["aa", "b"]]。这样,我们就逐步构建了每一个可能的回文分割方案并将有效的方案添加到结果集中。

在这里插入图片描述

class Solution {
public:// 主函数,调用回溯函数并返回结果vector<vector<string>> partition(string s) {backstracking(s,0); // 从字符串的第一个字符开始进行回溯return result; // 返回所有可能的分割方案}private:vector<vector<string>> result; // 存储所有可能的分割方案vector<string> path; // 用于存储当前的分割方案// 检查一个子串是否是回文串bool cheak(string& s,int begin,int end) {for(int i=begin,j=end;i<j;i++,j--) // 从两头开始向中间检查if(s[i]!=s[j]) // 如果两头字符不相等,则不是回文return false; // 返回 falsereturn true; // 所有字符都相等,返回 true}// 回溯函数void backstracking(string& s,int start) {if(start==s.size()) { // 如果 start 等于字符串的长度,表示已经处理完毕result.push_back(path); // 将当前的分割方案添加到结果中return ; // 返回上一层}// 从 start 开始往后查找可能的分割点for(int i=start;i<s.size();i++) {if(cheak(s,start,i)) { // 检查从 start 到 i 的子串是否是回文string str=s.substr(start,i-start+1); // 是,将其作为一个分割path.push_back(str); // 将子串添加到当前的分割方案中} else {continue; // 如果不是回文,跳过当前的字符,继续下一轮循环}backstracking(s,i+1); // 递归调用,从下一个字符开始继续分割剩余的字符串path.pop_back(); // 回溯,移除最后添加的子串,尝试其他可能的分割点}}
};

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

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

相关文章

Android 架构MVI、MVVM、MVC、MVP

目录 一、MVC&#xff08;Model-View-Controller&#xff09; 二、 MVP&#xff08;Model-View-Presenter&#xff09; 三. MVVM&#xff08;Model-View-ViewModel&#xff09; 四. MVI&#xff08;Model-View-Intent&#xff09; 五.MVI简单实现 先简单了解一下MVC、MVP和…

索引使用规则6——单列索引联合索引

1、单列索引 单列索引&#xff1a;即一个索引只包含单个列 举个例子 1.1、给phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查询发现可能的索引有好几个&#xff0c;但是最终选择了phone的索引…

萝卜大杂烩 | 提高数据科学工作效率的 8 个 Python 库

本文来源公众号“萝卜大杂烩”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提高数据科学工作效率的 8 个 Python 库 在进行数据科学时&#xff0c;可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库…

贪吃蛇(C语言)步骤讲解

一&#xff1a;文章大概 使用C语言在windows环境的控制台中模拟实现经典小游戏 实现基本功能&#xff1a; 1.贪吃蛇地图绘制 2.蛇吃食物的功能&#xff08;上&#xff0c;下&#xff0c;左&#xff0c;右方向控制蛇的动作&#xff09; 3.蛇撞墙死亡 4.计算得分 5.蛇身加…

[C语言]——C语言常见概念(1)

目录 一.C语言是什么、 二.C语言的历史和辉煌 三.编译器的选择&#xff08;VS2022为例&#xff09; 1.编译和链接 2.编译器的对比 3.VS2022 的优缺点 四.VS项目和源文件、头文件介绍 五.第⼀个C语言程序 ​​​​​​​ 一.C语言是什么、 ⼈和⼈交流使⽤的是⾃然语⾔&…

【python】爬取链家二手房数据做数据分析【附源码】

一、前言、 在数据分析和挖掘领域中&#xff0c;网络爬虫是一种常见的工具&#xff0c;用于从网页上收集数据。本文将介绍如何使用 Python 编写简单的网络爬虫程序&#xff0c;从链家网上海二手房页面获取房屋信息&#xff0c;并将数据保存到 Excel 文件中。 二、效果图&#…

【JS】解构赋值注意点,解构赋值报错

报错代码 const 小明 { email: 6, pwd: 66 } const 小刚 { email: 9, pwd: 99 }const { email } 小明 const { email } 小刚 报错图 原因 2个常量重复&#xff0c;重复在同一个作用域内是不能重复的&#xff0c;例如大括号内{const a 1; const a 2} 小伙伴A提问 问&…

Redis-基础篇

Redis是一个开源、高性能、内存键值存储数据库&#xff0c;由 Salvatore Sanfilippo&#xff08;网名antirez&#xff09;创建&#xff0c;并在BSD许可下发布。它不仅可以用作缓存系统来加速数据访问&#xff0c;还可以作为持久化的主数据存储系统或消息中间件使用。Redis因其数…

leetcode:37.解数独

题目理解&#xff1a;本题中棋盘的每一个位置都要放一个数字&#xff08;而N皇后是一行只放一个皇后&#xff09;&#xff0c;并检查数字是否合法&#xff0c;解数独的树形结构要比N皇后更宽更深。 代码实现&#xff1a;

SpringBoot+Redis 解决海量重复提交问题,yyds!

在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求&#xff0c;我们来解释一下幂等的概念&#xff1a;任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义&#xff0c;最终的含义就是 对数据库的影响只能是一次性的&#xff0c;不能重复处理。如何保证其…

JetBrains Gateway Github Copilot 客户端插件和主机插件

JetBrains Gateway可以通过插件支持Github Copilot&#xff08;需另行注册&#xff09;。 需要安装插件 客户端&#xff0c;而非插件 主机&#xff0c;如图所示&#xff1a; 大概是因为代码显示在客户端&#xff08;运行在本地的IDE&#xff09;&#xff1f;

NOC2023软件创意编程(学而思赛道)python初中组复赛真题

目录 下载打印原文档做题: 软件创意编程 一、参赛范围 1.参赛组别:小学低年级组(1-3 年级)、小学高年级组(4-6 年级)、初中组。 2.参赛人数:1 人。 3.指导教师:1 人(可空缺)。 4.每人限参加 1 个赛项。 组别确定:以地方教育行政主管部门(教委、教育厅、教育局) 认…

Python 潮流周刊#40:白宫建议使用 Python 等内存安全的语言

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯&#xff0c;…

三层靶机靶场之环境搭建

下载&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;f4as 简介 2019某CTF线下赛真题内网结合WEB攻防题库&#xff0c;涉 及WEB攻击&#xff0c;内网代理路由等技术&#xff0c;每台服务器存在一个 Flag&#xff0c;获取每一 个Flag对应一个积分&…

在docker中搭建selenium 爬虫环境(3分钟快速搭建)

1、安装docker 省略 2、拉取镜像 docker pull selenium/standalone-chrome-debug 3、运行容器 docker run -d -p 4444:4444 -p 5900:5900 -v C:\Users\Public\VNC_Donwnloads:/home/seluser/Downloads --memory6g --name selenium_chrome selenium/standalone-chrome-debu…

大数据核心技术概论

大数据核心技术概述 大数据基石三大论文&#xff1a;GFS&#xff08;Hadoop HDFS&#xff09;、BigTable&#xff08;Apache HBase&#xff09;、MapReduce&#xff08;Hadoop MapReduce&#xff09;。 搜索引擎的核心任务&#xff1a;一是数据采集&#xff0c;也就是网页的爬…

matlab 感知器算法

1. 原理 两类线性可分的模式类&#xff1a;&#xff0c;设判别函数为&#xff1a;。 对样本进行规范化处理&#xff0c;即类样本全部乘以(-1)&#xff0c;则有&#xff1a; 感知器算法通过对已知类别的训练样本集的学习&#xff0c;寻找一个满足上式的权向量。 2. 过程 2.1 …

力扣 分割回文串

输出的是不同的分割方案 class Solution { public:vector<vector<bool>>flag;vector<string>ans;vector<vector<string>>nums;void dfs(string &s,int i){int ns.size();if(in){i表示s长度&#xff0c;等于即全部分割完毕nums.push_back(ans…

第十三篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure的Face API开发人脸识别门禁系统经典案例

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、实现步骤和雏形示例代码二、扩展思路介绍三、活体检测深度解读和示例代码四、人脸注册和管理示例代码五、实时监控和报警示例代码六、多因素认证示例代码七、访客管理示例代码…

03-JNI 类型和数据结构

上一篇&#xff1a; 02-设计概述 本章讨论 JNI 如何将 Java 类型映射为本地 C 类型。 3.1 原始类型 下表描述了 Java 原始类型及其与机器相关的本地等价类型。 为方便起见&#xff0c;定义如下&#xff1a; #define JNI_FALSE 0 #define JNI_TRUE 1 jsize 整数类型用于描述…