class Solution {
public:
void partitionHelper(int index, string s, vector < string > & path,
vector < vector < string > > & res) {
if (index == s.size()) {
res.push_back(path);
return;
}
for (int i = index; i < s.size(); ++i) {
if (isPalindrome(s, index, i)) {
path.push_back(s.substr(index, i - index + 1));
partitionHelper(i + 1, s, path, res);
path.pop_back();
}
}
}
bool isPalindrome(string s, int start, int end) {
while (start <= end) {
if (s[start++] != s[end--])
return false;
}
return true;
}
vector<vector<string>> partition(string s)
{
vector < vector < string > > res;
vector < string > path;
partitionHelper(0, s, path, res);
return res;
}
};
Y2xhc3MgU29sdXRpb24gewpwdWJsaWM6CgogICAgdm9pZCBwYXJ0aXRpb25IZWxwZXIoaW50IGluZGV4LCBzdHJpbmcgcywgdmVjdG9yIDwgc3RyaW5nID4gJiBwYXRoLAogICAgdmVjdG9yIDwgdmVjdG9yIDwgc3RyaW5nID4gPiAmIHJlcykgewogICAgaWYgKGluZGV4ID09IHMuc2l6ZSgpKSB7CiAgICAgIHJlcy5wdXNoX2JhY2socGF0aCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IHMuc2l6ZSgpOyArK2kpIHsKICAgICAgaWYgKGlzUGFsaW5kcm9tZShzLCBpbmRleCwgaSkpIHsKICAgICAgICBwYXRoLnB1c2hfYmFjayhzLnN1YnN0cihpbmRleCwgaSAtIGluZGV4ICsgMSkpOwogICAgICAgIHBhcnRpdGlvbkhlbHBlcihpICsgMSwgcywgcGF0aCwgcmVzKTsKICAgICAgICBwYXRoLnBvcF9iYWNrKCk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgaXNQYWxpbmRyb21lKHN0cmluZyBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHsKICAgICAgaWYgKHNbc3RhcnQrK10gIT0gc1tlbmQtLV0pCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICAgIHZlY3Rvcjx2ZWN0b3I8c3RyaW5nPj4gcGFydGl0aW9uKHN0cmluZyBzKSAKICAgIHsKICAgICAgICB2ZWN0b3IgPCB2ZWN0b3IgPCBzdHJpbmcgPiA+IHJlczsKICAgICAgICB2ZWN0b3IgPCBzdHJpbmcgPiBwYXRoOwogICAgICAgIHBhcnRpdGlvbkhlbHBlcigwLCBzLCBwYXRoLCByZXMpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn07