用动态规划可解。
二维数组dp[i][j]表示i到j是回文
状态转换方程 dp[j+1][i-1] && s[j] == s[i]
class Solution {
public:
vector<vector<string>> partition(string s) {
if( s == "")
return vector< vector< string> >();
int size = s.size();
vector< vector< bool> > dp( size, vector< bool>( size, false));
for( int i = 0; i < size; ++i)
dp[i][i] = true;
for( int i = 0; i < size; ++i){
for( int j = 0; j < i; ++j){
if( s[j] == s[i] && dp[j+1][i-1]){
dp[j][i] = true;
}
if( s[j] == s[i] && j == i - 1){
dp[j][i] = true;
}
}
}
vector< vector< string> > res;
vector< string> t;
allPalindrome( res, s, dp, t, 0);
return res;
}
void allPalindrome( vector<vector< string> > &res, string s, vector< vector< bool> > &dp, vector< string> &t, int col){
if( col == s.size()){
res.push_back(t);
return;
}
for( int j = col; j < s.size(); ++j){//这里行坐标是固定的,因为如果这行没有true表示当前字母到后面所有字母没有回文
if(dp[col][j]){
vector< string> tmp = t;
tmp.push_back( s.substr(col, j-col+1));
allPalindrome( res, s, dp, tmp, j + 1);
}
}
}
};