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/9/28 13:36:48 阅读更多 →
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/9/28 14:30:56 阅读更多 →
深入解析HikariCP初始化:从配置到高性能连接池的构建

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

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

2026/9/26 16:24:58 阅读更多 →

最新新闻

LLM红队实战:从攻击面枚举到防护策略的完整方法论

LLM红队实战:从攻击面枚举到防护策略的完整方法论

1. 从“Lysios”这个名字说起:LLM红队到底在防什么第一次看到“Lysios – LLM red teaming org”这个标题,很多人会愣一下:Lysios是什么?是一个开源工具、一个组织代号,还是一套方法论?从命名习惯来看&…

2026/9/29 0:00:05 阅读更多 →
LSTM时间序列预测实战:从数据窗口构造到模型调参避坑

LSTM时间序列预测实战:从数据窗口构造到模型调参避坑

简介:这份资源面向高校学生与Python初学者,提供一套可直接运行的LSTM时间序列预测完整项目,适用于期末大作业、课程设计及入门级深度学习实践。项目以空气质量等真实数据为样本,覆盖数据预处理、模型搭建、训练与预测全流程&#…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
技术创始人的AI原生业务操作系统:Zrevick架构与实操指南

技术创始人的AI原生业务操作系统:Zrevick架构与实操指南

1. 技术创始人为什么需要一个“AI原生”的业务操作系统技术创始人有一个非常典型的困境:写代码的时候思路清晰、效率极高,一旦切换到业务侧——客户跟进、发票管理、合同签署、财务对账、团队任务分配——整个人就像被扔进了一个完全陌生的代码库&#x…

2026/9/28 23:59:04 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/28 3:51:11 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →