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"] ]
动规还TLE 我也是醉了!
class Solution {
public:
vector<vector<string>> partition(string s) {
//dp解法
/*用来记录s[i]到s[j]是否为palindrome
dp[i][j] 1、s[i]==s[j]&&j-i<2
2、s[i]==s[j]&&s[i+1]到s[j-1]为palindrome
所以事先要知道dp[i+1][j-1] i是s.length-- j从i++
*/
const int n=s.size();
bool dp[n][n];
fill_n(&dp[0][0],n*n,false);
for(int i=s.size()-1;i>=0;i--)
for(int j=i;j<n;++j)
if(s[i]==s[j]&&(j-i<2)||dp[i+1][j-1])
dp[i][j]=true;
//开始根据dp[i][j]截取字符串 获得结果
vector<vector<string>> sub_palins[n];
for(int i=n-1;i>=0;i--)
for(int j=i;j<n;++j)
if(dp[i][j])
{
const string palindrome=s.substr(i,j-i+1);
if(j+1<n)
for(auto v:sub_palins[j+1])
{
v.insert(v.begin(),palindrome);
sub_palins[i].push_back(v);
}
else{
sub_palins[i].push_back(vector<string>{palindrome});
}
}
return sub_palins[0];
}
};