题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/
题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
解题报告:
先dp预处理出所有所有回文串,然后dfs就行了。如果没要求输出所有方案数,则依旧可以O(n^2) dp出方案数。
AC代码:
class Solution {
public:
vector<vector<string>> ans;
vector<string> tmp;
int length;
int dp[1005][1005];
void dfs(int pos, string s) {
if(pos == length+1) {
ans.push_back(tmp);
return ;
}
for(int i = pos; i<=length; i++) {
if(dp[pos][i]) {
tmp.push_back(s.substr(pos-1,i-pos+1));
dfs(i+1,s);
tmp.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
length = s.length();
for(int l = 1; l<=length; l++) dp[l][l] = 1;
for(int l = 1; l<length; l++) {
if(s[l-1] == s[l]) dp[l][l+1] = 1;
}
for(int len = 3; len <= length; len++) {
for(int l = 1; l+len-1<=length; l++) {
int r = l+len-1;
dp[l][r] = dp[l+1][r-1] && (s[l-1] == s[r-1]);
}
}
dfs(1,s);
return ans;
}
};