回溯算法解决分割回文串问题的核心是「边切边验、切完即存、切错即退」,通过树形结构系统尝试各切割位置,仅保留回文路径,用startindex控制起点避免重复,双指针高效判回文,push-pop成对操作确保路径正确。

回溯算法解决分割回文串问题,核心是「边切边验、切完即存、切错即退」。它不预设分割数量或长度,而是系统性地尝试每个可能的切割位置,只保留回文子串路径,并在走到字符串末尾时收集完整方案。
明确回溯的树形结构
把字符串看作一条线,每次在某个位置“下刀”切出一个子串——这一步就是树的一个分支。例如对 "aab":
- 第一刀切在索引0后 → 得到 "a"(回文),剩余 "ab" 继续递归;
- 第一刀切在索引1后 → 得到 "aa"(回文),剩余 "b" 继续递归;
- 第一刀切在索引2后 → 得到 "aab"(非回文),直接跳过,不向下递归。
每条从根到叶的路径,就是一个合法的全回文分割方案。
用 startIndex 控制切割起点,避免重复和越界
每次递归都传入当前切割起始位置 startIndex,表示「从这里开始找下一个回文子串」:
- 初始调用为 backtrack(s, 0);
- 若切出子串 s[startIndex..i] 是回文,则下一层递归从 i + 1 开始;
- 当 startIndex == s.length(),说明整串已处理完毕,把当前路径加入结果。
这个设计天然保证切割顺序从左到右、不回头、不遗漏,也不会生成像 ["b","aa"] 这类逆序方案。
回文判断要高效且边界清晰
写一个双指针辅助函数 isPalindrome(s, left, right),检查闭区间 [left, right] 子串是否回文:
- 注意:left ≤ right 才进入循环,单字符(left == right)自动返回 true;
- 不要用 s.substring 后再反转比对,时间开销大;直接在原字符串上双指针校验,O(1) 空间、O(L) 时间(L为子串长);
- 常见错误:索引越界(如 right 超出 s.length()-1)或漏判空串,但本题约束 s 长度 ≥ 1,可省略空检。
回溯操作必须成对出现
每尝试一个合法子串,就要做两件事:
- push:把 s.substring(startIndex, i + 1) 加入路径;
- pop:递归返回后立刻移除它,为下一次 for 循环尝试其他终点腾出空间。
这个「进—探—出」三步闭环,是回溯能遍历所有组合而不污染路径的关键。漏掉 pop 就会导致后续分支携带错误前缀。











