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

news2024/9/30 7:16:59

文章目录

  • 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; // 返回 false
        return 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.coloradmin.cn/o/1485300.html

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

相关文章

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

oms-Diffusion:用户可上传服装图片与参考姿势图进行试穿,解决服装行业高昂成本问题

之前已经向大家介绍了很多关于虚拟试穿的项目&#xff0c;如谷歌的Tryon Diffusion, 阿里的Outfit Anyone, 亚马的Diffuse to Choose。东京大学的OOTDiffusion虚拟服装试穿工具。基于扩散模型的技术基本已经成为现在主流应用的基石。感兴趣的小伙伴可以点点击下面链接阅读~ 电商…

GEE入门篇|图像处理(一):理论介绍

光谱指数是基于地球表面不同的物体和土地覆盖反射不同波长的不同数量的太阳光的事实。例如&#xff0c;在光谱的可见部分&#xff0c;健康的绿色植物反射大量的绿光&#xff0c;同时吸收蓝光和红光——这就是为什么它在我们的眼中是绿色的。来自太阳的光的波长也超出了人眼所能…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

LaTeX-设置表格大小

文章目录 LaTeX-设置表格大小1.创建表格2.设置表格的宽度2.1控制表格每一列的宽度2.2控制整个表格的宽度 3.设置表格的外观4.LaTeX绘制三线表 LaTeX-设置表格大小 本文介绍了LaTeX如何设置表格的大小、改变表格的外观以及如何绘制三线表。 1.创建表格 在LaTeX中创建表很耗时…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

100个百万阅读公众号爆文案例

100个100万公众号爆文案例 自从公众号流量推送修改之后&#xff0c;原来的私域玩法一去不复返&#xff0c;公域公众号正在崛起 现在公众号的玩法就是找爆款&#xff0c;去对标&#xff0c;去学习&#xff0c;努力使自己的公众号进入流量池&#xff0c;然后吃流量主的收益 这里…

【数据结构和算法】根据前序、中序、后序来确定一颗二叉树

目录 0 引言1 确定二叉树结构的方式1.1 前序和中序1.2 后序和中序1.3 前序和后序&#xff1a;无法确定结构 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计网概述、计网…

Redis-基础篇

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

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

文献阅读笔记《Spatial-temporal Forecasting for Regions without Observations》13页

目录 目录 目录 发行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK&#xff08;相关工作 2.1 Spatial-temporal Forecasting&#xff08;时空预测 2.2 Spatial-temporal Forecasting withIncomplete Data&#xff08;不完全数据的时空预测 2.3 Graph Contrastive Lear…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

VS Code(Visual Studio Code)本地(local)和远程(ssh)Docker Container 下的 Python 开发和调试

VS Code&#xff08;Visual Studio Code&#xff09;本地&#xff08;local&#xff09;和远程&#xff08;ssh&#xff09;Docker Container 下的 Python 开发和调试 1. 目的需求2. VS Code 简介3. 使用实践&#xff1a;一个简单的实例3.1 准备工作3.1.1 远程服务器3.1.2 本地…

测试面试精选题:可用性测试主要测试哪些方面,举例说明

1.界面设计&#xff1a; 评估软件的用户界面设计是否直观、美观、易于理解和操作。 测试用例&#xff1a;打开软件&#xff0c;查看界面布局是否合理&#xff0c;各个功能是否容易找到&#xff0c;是否符合用户习惯。 2.导航和布局&#xff1a; 评估用户在软件中导航和查找…