https://leetcode-cn.com/problems/palindrome-partitioning/
アイデア:dp dp firstD pは、前処理された場合、S [I ... J]の[I ... J]s [ i…j ]は回文素数であるため、dp [i] [j] = 1 dp [i] [j] = 1d p [ 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;
}
};