LeetCode 131. 分割回文串
题目描述给定一个字符串s将它分割成若干子串使每个子串都是回文串返回所有可能的分割方案。例如输入s aab 输出[[a,a,b],[aa,b]]初始思路一开始想到使用滑动窗口先固定一个长度k再按照这个长度依次截取子串。如果截取出的字符串是回文串就把它加入答案。这种思路可以找到部分等长切分却无法表示题目要求的所有方案。例如s aab两个合法方案分别是[a, a, b] [aa, b]第一种方案的子串长度是1、1、1第二种方案的子串长度是2、1。固定窗口长度k之后同一条分割路径中的每一段只能等长因此会漏掉长度不同的组合。这道题真正需要枚举的不是窗口长度而是每一步的切割位置。解题思路使用回溯从尚未分割的位置start开始枚举当前子串的结束位置end。定义递归函数dfs(start)它表示s[0, start) 已经完成分割现在从 start 开始继续寻找合法方案对于每一个end当前候选子串是s[start, end]如果它是回文串就可以做出本层选择1. 将 s[start, end] 加入 path 2. 从 end 1 继续分割 3. 递归返回后将该子串从 path 中移除如果start s.length()说明整个字符串已经分割完毕并且path中每一段都经过了回文判断此时将当前路径加入答案。以s aab为例搜索过程可以简化为从下标 0 开始 ├── 选择 a │ └── 从下标 1 开始 │ ├── 选择 a │ │ └── 选择 b - [a, a, b] │ └── ab 不是回文串 └── 选择 aa └── 从下标 2 开始 └── 选择 b - [aa, b]代码实现class Solution { public ListListString partition(String s) { ListListString ans new ArrayList(); ListString path new ArrayList(); dfs(s, 0, path, ans); return ans; } private void dfs( String s, int start, ListString path, ListListString ans) { if (start s.length()) { ans.add(new ArrayList(path)); return; } for (int end start; end s.length(); end) { if (!isPalindrome(s, start, end)) { continue; } path.add(s.substring(start, end 1)); dfs(s, end 1, path, ans); path.remove(path.size() - 1); } } private boolean isPalindrome(String s, int left, int right) { while (left right) { if (s.charAt(left) ! s.charAt(right)) { return false; } left; right--; } return true; } }为什么回溯能够枚举所有方案对于位置start循环会依次尝试所有可能的结束位置for (int end start; end s.length(); end)因此当前子串可能是s[start, start] s[start, start 1] s[start, start 2] ...只有当前子串是回文串时才会递归处理剩余部分。这样既不会遗漏某个切割位置也不会让非回文子串进入最终答案。path记录的是一条正在搜索的分割路径。递归结束后执行path.remove(path.size() - 1);可以撤销本层选择让下一次循环尝试另一个结束位置。为什么滑动窗口不适合这道题滑动窗口通常维护一个连续区间并根据条件移动左右边界适合寻找最长、最短或满足某种性质的单个区间。这道题要求返回所有分割方案。每确定一个子串后剩余字符串还可能有多种切法因此搜索过程会产生多个分支。两者的状态结构不同滑动窗口移动边界维护一个区间 回溯枚举切点保留一条路径并继续搜索剩余部分固定长度k只能处理等长切分而回溯中的end会在每一层重新枚举所以同一条路径中的子串长度可以不同。易错点1. 使用固定长度 k 分割固定k后每次都截取长度相同的子串会漏掉混合长度的分割方案。应该用start表示当前起点并在当前层枚举所有end。2. 判断了整个字符串是否回文每次需要判断的是当前候选子串s[start, end]不是原字符串s。如果始终判断整个s就无法决定当前这一刀是否可以切下去。3. substring 的方法名和右边界Java 中的方法名是substring(beginIndex, endIndex)不是subString。同时endIndex是左闭右开的右边界。要截取包含下标end的子串需要写s.substring(start, end 1)如果调用s.substring(i, i k)必须保证i k s.length()否则会抛出StringIndexOutOfBoundsException。4. 找到答案时没有复制 path不能直接写ans.add(path);因为path后续还会被修改。应该保存它当前状态的副本ans.add(new ArrayList(path));5. 递归后没有撤销选择加入当前子串后递归返回时必须将它移除path.add(part); dfs(...); path.remove(path.size() - 1);否则上一条路径中的子串会残留到下一条路径中。复杂度分析长度为n的字符串一共有n - 1个潜在切割位置每个位置都可能切或不切因此分割方案数量最多达到2^(n - 1)。时间复杂度O(n * 2^n)。需要搜索指数级分割方案构造每个答案最多需要O(n)时间。辅助空间复杂度O(n)。递归深度和当前路径最多都是n。如果计算返回结果答案本身还需要O(n * 2^n)空间。复盘这次的关键问题是把“分割”理解成了固定窗口切片。看到“返回所有可能的分割方案”时应该优先想到每个位置都可能成为切点需要用回溯枚举不同选择。这题的递归状态可以记为start 表示下一段从哪里开始 end 表示当前这一段在哪里结束 path 表示已经选出的回文子串每一层的完整过程是枚举结束位置 - 检查回文 - 加入路径 - 递归剩余部分 - 撤销选择Tips遇到字符串分割问题可以先问自己1. 每一段的长度是否固定 2. 题目是否要求所有分割方案 3. 当前递归应该从哪个位置继续切 4. substring 的右边界是否可能越界对于这题可以记住一句话从 start 枚举 end当前段是回文就继续切递归返回后撤销当前段。

相关新闻

华硕笔记本终极轻量化控制:G-Helper完全指南与深度配置

华硕笔记本终极轻量化控制:G-Helper完全指南与深度配置

华硕笔记本终极轻量化控制:G-Helper完全指南与深度配置 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…

2026/8/3 1:39:37 阅读更多 →
G-Helper深度解析:如何用50MB内存替代Armoury Crate的500MB系统占用

G-Helper深度解析:如何用50MB内存替代Armoury Crate的500MB系统占用

G-Helper深度解析:如何用50MB内存替代Armoury Crate的500MB系统占用 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook…

2026/8/3 1:39:37 阅读更多 →
深入解析HikariCP初始化:从配置到高性能连接池的构建

深入解析HikariCP初始化:从配置到高性能连接池的构建

1. 项目概述:为什么我们需要深入理解HikariCP的初始化?在Java后端开发里,数据库连接池几乎和空气一样,是看不见但又离不开的基础设施。尤其是当你用上Spring Boot,它默认集成的HikariCP,更是成了“开箱即用…

2026/8/3 1:39:37 阅读更多 →

最新新闻

GPT与Grok API调用实战:从环境搭建到工程化部署

GPT与Grok API调用实战:从环境搭建到工程化部署

最近在技术社区和开发者圈子里,关于大语言模型的讨论热度持续攀升。从 Grok 的快速迭代到 GPT 系列的持续进化,再到 OpenAI 面临的各类事件,以及全球范围内对 AI 技术的追赶,每一个动态都牵动着开发者和技术决策者的神经。对于开发…

2026/8/3 2:25:56 阅读更多 →
城乡规划数字化转型:GIS与Python技能提升指南

城乡规划数字化转型:GIS与Python技能提升指南

1. 城乡规划行业现状与就业挑战最近两年,不少城乡规划专业的毕业生和从业者都感受到了明显的就业压力。设计院项目缩减、地产行业调整、传统规划业务萎缩,这些现象确实让很多人对行业前景产生了疑虑。但作为一名在规划行业深耕十余年的从业者&#xff0c…

2026/8/3 2:25:56 阅读更多 →
基于大语言模型的《我的世界》自动化:从自然语言到游戏指令的实战指南

基于大语言模型的《我的世界》自动化:从自然语言到游戏指令的实战指南

最近在探索AI与游戏结合的玩法时,发现了一个非常有趣的领域:让AI来玩《我的世界》(Minecraft,简称MC)。虽然市面上已有一些AI玩MC的项目,但大多基于特定的强化学习框架或脚本。这次,我想尝试点不…

2026/8/3 2:25:56 阅读更多 →
论文被吐槽逻辑乱?,有哪些真正值得拥有的的AI智能降重工具推荐?

论文被吐槽逻辑乱?,有哪些真正值得拥有的的AI智能降重工具推荐?

毕业论文降AIGC率,优先选语义优化 逻辑梳理 去AI痕迹的工具,免费与付费结合最稳妥。下面按中文、英文、免费 / 付费分类推荐,附实测效果与适用场景。 一、中文论文降重工具(最常用) 1. 千笔AI(综合全能首…

2026/8/3 2:25:56 阅读更多 →
在ODYSSEY-X86上自建Mender OTA服务器:边缘计算设备固件管理实战

在ODYSSEY-X86上自建Mender OTA服务器:边缘计算设备固件管理实战

1. 项目概述与核心价值最近在折腾一个边缘计算的小项目,手头正好有几块Seeed Studio的ODYSSEY - X86开发板。这板子性能不错,x86架构兼容性好,拿来跑服务很合适。项目里涉及到一批设备需要做固件OTA(空中下载技术)更新…

2026/8/3 2:24:56 阅读更多 →
实时通信(RTC)技术解析:从原理到应用场景的全面指南

实时通信(RTC)技术解析:从原理到应用场景的全面指南

1. 从“实时”说起:RTC到底是什么?如果你用过微信语音、打过视频会议,或者玩过需要实时开黑的游戏,那你其实已经和RTC打过无数次交道了。RTC,全称Real-Time Communication,中文叫实时通信。这个名字听起来有…

2026/8/3 2:24:56 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →