题目大意
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
解题思路
本题需要先求得所有的分割方式(例如aab–>‘a’ ‘a’ ‘b’ || ‘aa’ ‘b’ || ‘a’ ‘ab’ || ‘aab’),然后判断当前分割方式下,每一部分是否都是回文子串。
所有分割方式这一步不能被省略,因此考虑从判断回文子串方面入手。
对于一个字符串s,我们想要知道这个字符串在任意i~j
范围是否是回文子串。创建一个2D的dp数组,dp[i][j]
表示s[i]~s[j]
是否是回文串。
对于任意位置(i, j),s[i] ~ s[j] 如果是回文串,必须满足的是s[i] == s[j], 并且s[i + 1] ~ s[j - 1]这一段是回文串。因此能够得到状态转移方程。
dp数组的求解代码如下:
void getDPArray(vector<vector<bool>> & dp, string & s){
for (int i = s.size() - 1; i >=0; --i){
for (int j = i; j < s.size(); ++j){
if (j - i < 2)
dp[i][j] = (s[i] == s[j]);
else