Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = “aab”,
Return
[
[“aa”,”b”],
[“a”,”a”,”b”]
]
class Solution {
public:
vector<vector<string>> ans;
void dp(string &s, int **d)
{
for(int i=s.length()-1; i>=0; i--)
{
for(int j=i; j<s.length(); j++)
{
if(i == j)
{
d[i][j] = 1;
}
else if(s[i] == s[j])
{
if(i+1 == j || d[i+1][j-1] == 1)
d[i][j] = 1;
}
}
}
}
void dfs(string &s, vector<string> &tmp, int start, int **d)
{
if(start >= s.length())
{
ans.push_back(tmp);
return;
}
for(int i=start; i<s.length(); i++)
{
if(d[start][i] == 1)
{
tmp.push_back(s.substr(start, i+1-start));
dfs(s, tmp, i+1, d);
tmp.pop_back();
}
}
}
vector<vector<string>> partition(string s)
{
vector<string> tmp;
int n = s.length();
if(n == 0)
{
ans.push_back(tmp);
return ans;
}
int **d = new int*[n];
for(int i=0; i<n; i++)
d[i] = new int[n];
for(int i=0; i<n; i++)
for(int j=i; j<n; j++)
d[i][j] = 0;
dp(s, d);
dfs(s, tmp, 0, d);
for(int i=0; i<n; i++)
delete d[i];
delete d;
return ans;
}
};