https://leetcode-cn.com/problems/palindrome-partitioning/
思路:先
d
p
dp
dp进行预处理,如果
s
[
i
…
j
]
s[i…j]
s[i…j]是回文串就令
d
p
[
i
]
[
j
]
=
1
dp[i][j]=1
dp[i][j]=1,详情看这篇博客。然后很显然就是搜索了吧……回溯法感觉也没多少好讲的……
class Solution {
public:
void dfs(vector<vector<string>> &ans,vector<int>& vec,const string &s,const vector<vector<bool>> &dp,int n)
{
int start=vec.back();
if(start==n)
{
vector<string> tmp;
int m=vec.size();
for(int i=1;i<m;i++)
tmp.push_back(move(s.substr(vec[i-1],vec[i]-vec[i-1])));
ans.push_back(move(tmp));
return;
}
for(int i=start;i<n;i++)
{
if(dp[start][i])
{
vec.push_back(i+1);
dfs(ans,vec,s,dp,n);
vec.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
int n=s.size();
vector<vector<bool>> dp(n,vector<bool>(n));
dp[0][0]=1;
for(int i=1;i<n;i++)
{
dp[i][i]=1;
if(s[i]==s[i-1])
dp[i-1][i]=1;
}
for(int len=3;len<=n;len++)
{
for(int i=0;i+len-1<n;i++)
{
int j=i+len-1;
if(s[i]==s[j]&&dp[i+1][j-1])
dp[i][j]=1;
}
}
vector<vector<string>> ans;
vector<int> vec(1);
dfs(ans,vec,s,dp,n);
return ans;
}
};