131. 分割回文串-两种回溯思路

article/2025/6/24 18:39:47

       

        我们可以将字符串分割成若干回文子串,返回所有可能的方案。如果将问题分解,可以表示为分割长度为n-1的子字符串,这与原问题性质相同,因此可以采用递归方法解决。

        为什么回溯与递归存在联系?在解决这个问题时,我们首先从短字符串开始构建(递的过程),当构造到最长字符串时,需要尝试其他方案(归的过程,即回溯)。

        思路一:可以将每两个字符之间的位置视为一个可选的分割点。选择或不选择每个分割点会产生不同的字符串组合。例如,在示例一中,这种思路会产生四种不同的分割方案。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​

       

        关于递归边界条件的写法:使用下标i表示当前位置。当i达到字符串长度时,说明分割完成,此时将当前方案存入ans列表。

对于非边界情况:

  1. 选择当前位置作为分割点:

    • 若当前子串是回文,则将其加入临时方案path
    • 递归处理i+1位置
    • 递归完成后需恢复现场,弹出path最后一个元素(回溯操作)
  2. 不选择当前位置作为分割点:

    • 直接递归处理i+1位置
class Solution {
public:vector<vector<string>> ans;vector<string> path;bool isPalindrome(string s,int left,int right) {while (left < right) {if (s[left++] != s[right--]) {return false;}}return true;}void dfs(int i,int n,string& s,int start) {if (i == n) {ans.emplace_back(path);return;}if (i < n - 1) dfs(i + 1,n,s,start);if(isPalindrome(s,start,i)) {path.push_back(s.substr(start,i - start + 1));dfs(i + 1,n,s,i + 1);path.pop_back();}}vector<vector<string>> partition(string s) {dfs(0,s.size(),s,0);return ans;}
};

        思路二,答案的视角(枚举子串的结束位置)

        我们以子串的结束位置j为基准,将当前回文子串加入候选路径,然后递归处理从j+1到n-1位置的剩余字符串分割问题。

class Solution {
public:vector<vector<string>> ans;vector<string> path;bool isPalindrome(string s,int left,int right) {while (left < right) {if (s[left++] != s[right--]) {return false;}}return true;}void dfs(int i,int n,string& s) {if (i == n) {ans.emplace_back(path);return;}for(int j = i;j < n;j++) {if (isPalindrome(s,i,j)) {path.push_back(s.substr(i, j - i + 1));dfs(j + 1,n,s);path.pop_back();}}}vector<vector<string>> partition(string s) {dfs(0,s.size(),s);return ans;}
};

        时间复杂度:O(n*2^n),递归次数为逗号的子集的个数,也就是2^n,在判断是否是会回文需要O(n)时间所以,总时间为O(n2^n)

        空间复杂度:O(n)


http://www.hkcw.cn/article/mbFxSglnGU.shtml

相关文章

Another Redis Desktop Manager 1.3.7 安装教程 - 详细步骤图解 (Windows)

在安装前需要下载安装包&#xff1a;https://pan.quark.cn/s/2dd4432cefaa 下载安装包 先找到那个叫 Another-Redis-Desktop-Manager.1.3.7.exe 的文件&#xff0c;双击它运行 安装向导 接着会出来安装界面&#xff0c;直接点“下一步”&#xff08;Next&#xff09;继续。 …

ShenNiusModularity项目源码学习(32:ShenNius.Admin.Mvc项目分析-17)

栏目管理页面用于新建、维护及删除系统CMS管理模块的栏目信息&#xff0c;栏目信息用于分类管理文章&#xff0c;其后台控制器类ColumnController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\Column内&#xff0c;其…

Python(十四)

1.type函数和init_subclass_ init_subclass_ 2.元类 类就是用来创建对象的模版&#xff0c;类是由type创造而来的&#xff0c;元类就是创建类的模版&#xff0c;type可以用来创造类&#xff0c;因为type本身就是一个元类&#xff0c;使用元类来创造类&#xff0c;元类之间也有…

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件&#xff1a;Generate GUID 3、修改SceneSave.cs脚本 添加1行代码&#xff1a; 4、修改TimeManager.cs脚本 添加&#xff1a; using System; 修改TimeManager类&#xff1a; 添加属…

蓝桥杯java2022年十三届国赛大学A组答案整理

小蓝与钥匙 问题描述 小蓝是幼儿园的老师, 他的班上有 28 个孩子, 今天他和孩子们一起进行了 一个游戏。 小蓝所在的学校是寄宿制学校, 28 个孩子分别有一个自己的房间, 每个房 间对应一把钥匙, 每把钥匙只能打开自己的门。现在小蓝让这 28 个孩子分别将 自己宿舍的钥匙上交…

【Block总结】Dynamic Tanh (DyT)|即插即用|何凯明和Yann LeCun署名

论文信息 Dynamic Tanh (DyT) 是由Meta、NYU、MIT和Princeton的研究团队提出的一种新方法,旨在取代Transformer模型中的归一化层(如LayerNorm和RMSNorm)。论文的核心目标是挑战深度学习中“归一化层不可或缺”的传统认知,提出一种更简单、更高效的替代方案。 DyT 的提出基…

不加载PHP OpenTelemetry SDK实现Trace‌与Logs

目录 前言一、回到OpenTelemetry原理看问题1、数据接收&#xff08;Receivers&#xff09;2、数据处理&#xff08;Processors&#xff09;3、数据导出&#xff08;Exporters&#xff09; 二、不加载OpenTelemetry SDK实现Trace‌与Logs示例 前言 前面两篇我们分别介绍了OpenT…

一文认识并学会c++模板初阶

文章目录 泛型编程&#xff1a;概念 函数模板概念&#xff1a;&#x1f6a9;函数模板格式原理&#xff1a;&#x1f6a9;函数模板实例化与非模板函数共存 类模板类模板实例化 泛型编程&#xff1a; 概念 &#x1f6a9;编写与类型无关的通用代码&#xff0c;是代码复写一种手段…

leetcode刷题日记——二叉树的右视图

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 二叉树的右视图&#xff1a;即二叉树每层最右边的节点BFS&#xff1a;使用层次遍历&#xff0c;每当遍历到每层最后一个节点时&#xff0c;记录改节点的值运行如下 int* rightSideView(struct TreeNode* root, int* returnS…

python 空气质量可视化,数据分析 + 前后端分离 + ppt 演讲大纲

1. 起因&#xff0c; 目的: 前段时间写的一个小项目&#xff0c;整理为一篇文章&#xff0c;发布出去&#xff0c;然后删掉项目。完整项目&#xff0c;见顶部链接。使用过程&#xff0c; 下面有说明。 2. 先看效果 3. 过程: 后端 python fastapi前端 python plotly # 数据…

|从零开始的Pyside2界面编程|绘图、布局及页面切换

&#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411;♈前言♈♈页面切换♈♈页面布局♈♈总结♈ ♈前言♈ 经过两周的学习自己设备的前端也算是完成了一小半了&#xff…

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块(Block) 是构成Minecraft世界的主要组成部分&#xff0c;是组成游戏地图的最基本单元&#xff0c;也是模组开发的核心元素之一…

计算机网络:物理层

目录 一、物理层的基本概念 二、物理层下面的传输媒体 2.1 导引型传输媒体 2.1.1 同轴电缆 2.1.2 双绞线 2.1.3 光纤 2.1.4 电力线 2.2 非导引型传输媒体 2.2.1 无线电波 2.2.2 微波 2.2.3 红外线 2.2.4 可见光 三、传输方式 3.1 串行与并行 3.2 同步与异步 3.…

我的世界Java版1.21.4的Fabric模组开发教程(十)更多物品交互行为

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十章——更多物品交互行为。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 在之前的创建自定义数据组件章节中&#xff0c;我们在自定义物品类中重写了来自Item类中的use()方法&#xff0c;实现了在右…

Linux531rsync定时同步 再回忆

rsync定时同步 环境配置 关闭防火墙&#xff0c;selinux systemctl stop firewalld systemctl disable firewall setenforce 0 cat /etc/selinux/configpei SELINUXdisable设置主机名 systemctl set-hostname code systemctl set-hostname backup设置静态IP rsync由于要设…

MySQL数据库复合查询

前言&#xff1a;本文不对SQL查询做详细讲解&#xff0c;而做案例实践&#xff0c;适合已掌握MySQL基础语法&#xff0c;需要通过实际案例巩固技能的开发者。 首先准备这样三张表 雇员信息表、部门信息、薪水等级。如下&#xff1a; 需要库文件的小伙伴私信我哦&#xff01;&am…

STM32 串口通信①:USART 全面理解 + 代码详解

一 前言 本篇文章并不会系统的从零开始讲起&#xff0c;适合大家对USART有一定的学习&#xff0c;再看本篇文章会有一定的收获&#xff0c;祝大家在本文中&#xff0c;吸收到新的知识。 二 通信方式 1&#xff09;按数据传输的方式分&#xff08;这就是“串行 vs 并行”&…

基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践

在企业数字化转型进程中&#xff0c;非结构化文本数据的处理与分析已成为核心技术挑战。传统自然语言处理方法在处理客户反馈、社交媒体内容和内部文档等复杂数据集时&#xff0c;往往难以有效捕获文本间的深层语义关联和结构化关系。大型概念模型&#xff08;Large Concept Mo…

极地导航的难点及应对措施(上)

在之前的博文《南北极导航选用什么投影&#xff1f;》和何老师的博文《高纬度、跨极区导航技术》中简单说了说南北极导航的投影设置问题。 本文主要说一说南北极导航中实际工作的难点问题以及应对措施。下图是南北极的位置图&#xff0c;从图中可以看出&#xff0c;南极是大陆…

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…