class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> out;
helper(s, 0, out, res);
return res;
}
void helper(string& s, int pos, vector<string>& out, vector<vector<string>>& res){
if(pos==s.size()) res.push_back(out);
else{
for(int i=pos;i<s.size();i++){
string t = s.substr(pos, i-pos+1);
if(isvalid(t)){
out.push_back(t);
helper(s, i+1, out, res);
out.pop_back();
}
}
}
}
bool isvalid(string s){
int l=0,r=s.size()-1;
while(l<r){
if(s[l]!=s[r]) return false;
else{
l++;
r--;
}
}
return true;
}
};