Solution:
We have already done in #4 about how to find palindrome in a string. Given isPal[i][j] which represents whether s[i...j] is palindrome, we could scan through the array to find the first palindrome A, then we go to collect the combination of other palindromes in the rest of the array. Once we get the collection, A + this collection would be the combination of palindromes in the array.
Code:
class Solution {
public:
vector<vector<string>> partition(string s) {
int n = s.length();
vector<vector<string>> res;
if(s.empty()) return res;
vector<vector<bool>> isPal(n, vector<bool>(n,false));
//determine where the palindromes are in the string
for(int i = 0; i < n; i ++){
isPal[i][i] = true;
for(int j = 0; j < i; j ++){
if( j== i -1){
isPal[j][i] = s[i]==s[j];
}else{
isPal[j][i] = isPal[j+1][i-1] && s[j] == s[i];
}
}
}
vector<string> member;
search(0,s,member, isPal,res);
return res;
}
void search(int start, string &s,vector<string>member, vector<vector<bool>> &pal, vector<vector<string>> &res){
if(start >= s.length()) {
res.push_back(member);
return;
}
for(int i = start; i < s.length(); i++){
if(pal[start][i]){//if we have a panlidrome, record this panlidrome, and keep partition the array and find the panlidromes in the rest of the array.
member.push_back(s.substr(start,i - start +1));
search(i+1, s, member, pal, res);
member.pop_back();
}
}
}
};