1. 项目概述:LeetCode 131 分割回文串
LeetCode 131 是一道经典的字符串处理与回溯算法结合的题目,要求将给定字符串分割成若干子串,使得每个子串都是回文串,并返回所有可能的分割方案。这道题在技术面试中出现频率较高,主要考察对字符串操作、递归回溯和动态规划的综合运用能力。
作为一道中等难度的题目,它完美衔接了基础字符串操作和高级算法思想。我在第一次遇到这个问题时,花了整整两小时才写出一个勉强能通过的解法。经过反复优化和总结,现在可以分享一套系统性的解决思路,涵盖从暴力回溯到记忆化优化的完整演进路径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 回文串判定原理
回文串是指正读反读都相同的字符串,判断方法主要有三种:
- 双指针法:从首尾向中间遍历比较
- 字符串反转法:直接反转后比较原串
- 动态规划法:构建DP表存储子串状态
在本题中,我们需要频繁判断子串是否为回文,因此采用动态规划进行预处理是最优选择。建立一个二维数组dp,其中dp[i][j]表示s[i...j]是否为回文串。填充规则如下:
- 单个字符必为回文(i == j)
- 两个相同字符为回文(j = i+1且s[i]==s[j])
- 超过两个字符时:s[i]==s[j]且dp[i+1][j-1]为真
python复制def preprocess(s: str) -> List[List[bool]]:
n = len(s)
dp = [[False]*n for _ in range(n)]
for i in range(n-1, -1, -1):
for j in range(i, n):
if s[i] == s[j] and (j-i <= 2 or dp[i+1][j-1]):
dp[i][j] = True
return dp
2.2 回溯算法实现
回溯法是解决组合问题的利器,其核心框架包含三个部分:
- 路径选择:将当前子串加入临时结果
- 递归探索:处理剩余字符串
- 状态撤销:回溯到上一步
具体到本题的实现步骤:
- 从索引start开始遍历字符串
- 当发现s[start:i+1]是回文时,将其加入当
