Recursion with backtracking.
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> result;
if(s.length()==0) return result;
vector<string> cur;
parHelper(s,0,result,cur);
return result;
}
void parHelper(string &s, int start, vector<vector<string>> &res, vector<string> cur)
{
if(start==s.length()) {
res.push_back(cur);
return;
}
for(int i=start; i<s.length(); i++)
if(isPar(s,start, i)) {
cur.push_back(s.substr(start,i-start+1));
parHelper(s,i+1,res,cur);
cur.pop_back();
}
}
bool isPar(string &s, int start, int end) {
while(start<end) {
if(s[start]!=s[end]) return false;
start++;end--;
}
return true;
}
};