Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
Use a pointer to keep tracking the left substr. Whenever we found a palindrome substring, push it into path vector until the pos reaches the end.
#include <string>
#include <iostream>
using namespace std;
bool isPalindrome(string tmp) {
if(tmp.size() <= 1) return true;
int i = 0;
int j = tmp.size() - 1;
while(i <= j) {
if(tmp[i] != tmp[j]) return false;
i++;
j--;
}
return true;
}
void partition(string s, int pos, vector<string>& path, vector< vector<string> >& res) {
if(pos == s.size()) {
res.push_back(path);
return;
}
for(int i = pos; i < s.size(); ++i) {
string tmp = s.substr(pos, i - pos + 1);
if(isPalindrome(tmp)) {
path.push_back(tmp);
partition(s, i + 1, path, res);
path.pop_back();
}
}
}
vector< vector<string> > partition(string s) {
if(s.size() == 0) return {};
vector< vector<string> > res;
vector<string> path;
partition(s, 0, path, res);
return res;
}
int main(void) {
vector< vector<string> > res = partition("abcb");
for(int i = 0; i < res.size(); ++i) {
for(int j = 0; j < res[i].size(); ++j) {
cout << res[i][j] << ",";
}
cout << endl;
}
}