题目描述:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab"
Output:
[
["aa","b"],
["a","a","b"]
]
求一个字符串是所有可能的拆分子字符串集,并保证所有的子字符串都是回文字符串。
这道题可以采用递归的方法,讨论所有可能的拆分方法,并且判断子字符串是否为回文字符串,不过这种方法的时间复杂度太高。
更好的方法是采用动态规划,判断从s[i]到s[j]是否为回文字符串,同时用result[j]保存从s[0]到s[j]可以拆分的回文子字符串集合。如果发现从s[i]到s[j]是回文字符串,那么result[i-1]和s.substr(i,j-i+1)可以组合得到result[j],这样得到的result[n-1]就是最终结果。
class Solution {
public:
vector<vector<string>> partition(string s) {
int n=s.size();
vector<bool> row(n,false);
vector<vector<bool>> isPalin(n,row);
vector<vector<string>> x;
vector<vector<vector<string>>> result(n,x);
if(n==0) return x;
else if(n>=1)
{
vector<string> v(1,s.substr(0,1));
result[0].push_back(v);
}
for(int j=1;j<n;j++)
{
for(int i=0;i<=j;i++)
{
if(i==j) isPalin[i][j]=true;
else if(j==i+1&&s[i]==s[j]) isPalin[i][j]=true;
else if(isPalin[i+1][j-1]&&s[i]==s[j]) isPalin[i][j]=true;
if(isPalin[i][j]==true)
{
if(i==0)
{
vector<string> temp(1,s.substr(0,j+1));
result[j].push_back(temp);
}
else
{
for(int k=0;k<result[i-1].size();k++)
{
vector<string> temp=result[i-1][k];
temp.push_back(s.substr(i,j-i+1));
result[j].push_back(temp);
}
}
}
}
}
return result[n-1];
}
};