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/10/10 14:13:25 阅读更多 →
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/10/9 21:41:33 阅读更多 →
深入解析HikariCP初始化:从配置到高性能连接池的构建

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

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

2026/10/6 21:37:10 阅读更多 →

最新新闻

Streamyfin 后台下载模块(Background Downloader)深入解析:从 TypeScript API 到 iOS / Android 原生实现

Streamyfin 后台下载模块(Background Downloader)深入解析:从 TypeScript API 到 iOS / Android 原生实现

音视频移动开发 【免费下载链接】streamyfin A modern Jellyfin client built with Expo 项目地址: https://gitcode.com/gh_mirrors/st/streamyfin 点击查看 免费下载 本篇技术指南以 modules/background-downloader/README.md 为骨架,结合 Streamyfin…

2026/10/13 6:00:40 阅读更多 →
10 分钟跑通私有本地 AI 聊天:Open WebUI 从零部署到第一句对话

10 分钟跑通私有本地 AI 聊天:Open WebUI 从零部署到第一句对话

10 分钟跑通私有本地 AI 聊天:Open WebUI 从零部署到第一句对话 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI 是一个开源的自托管…

2026/10/13 6:00:40 阅读更多 →
Kener 状态徽章实战指南:status、uptime 与 Dot 徽章的 URL 语法、查询参数与源码实现解析

Kener 状态徽章实战指南:status、uptime 与 Dot 徽章的 URL 语法、查询参数与源码实现解析

可观测性后端前端运维 【免费下载链接】kener Stunning status pages, batteries included! 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ke/kener 点击查看 免费下载 Kener 内置了三种可直接以 <img> 引入的状态徽章&#xff08;Badge&#xff09;&#xff1…

2026/10/13 6:00:40 阅读更多 →
AUV协同定位与故障检测一体化MATLAB实现

AUV协同定位与故障检测一体化MATLAB实现

简介&#xff1a;本资源是一份面向海洋机器人与水下自主系统研究者的AUV协同定位算法实现方案&#xff0c;聚焦多AUV编队中高精度定位与实时故障检测两大核心挑战&#xff0c;适用于自动化、控制工程及海洋探测方向的研究生、科研人员与算法工程师。压缩包为RAR格式&#xff0c…

2026/10/13 6:00:40 阅读更多 →
Pomotroid 计时器时长键盘输入:从整分钟滑块到 MM:SS 精确设置的完整改造指南

Pomotroid 计时器时长键盘输入:从整分钟滑块到 MM:SS 精确设置的完整改造指南

【免费下载链接】pomotroid :tomato: Simple and visually-pleasing Pomodoro timer 项目地址&#xff1a; https://gitcode.com/gh_mirrors/po/pomotroid 点击查看 免费下载 Pomotroid 是一款基于 Tauri&#xff08;Rust Svelte&#xff09;的番茄钟应用。本篇技术指南围绕其…

2026/10/13 6:00:40 阅读更多 →
OpenClaw 跨平台部署指南:Windows/macOS/Linux 环境搭建避坑全记录

OpenClaw 跨平台部署指南:Windows/macOS/Linux 环境搭建避坑全记录

如果你准备把 OpenClaw 真正用起来&#xff0c;第一道门槛往往不是模型接入&#xff0c;也不是技能配置&#xff0c;而是环境搭建。我见过太多人卡在“装好了但跑不动”“这台能跑换台就崩”的阶段&#xff0c;尤其是在 Windows、macOS、Linux 三套系统之间反复横跳的时候&…

2026/10/13 5:59:40 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →