Palindrome Partitioning
class Solution {
private:
vector<vector<int> >dp;
public:
void dfs(const string &s, int n, vector<vector<string> >&vvs, vector<string> &vs) {
if (n == s.length()) {
vvs.push_back(vs);
return ;
}
for (int i = n; i < s.length(); ++i) {
if (dp[n][i]) {
vs.push_back(s.substr(n, i - n + 1));
dfs(s, i + 1, vvs, vs);
vs.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
int n = s.length();
//init dp
dp.resize(n);
for (int i = 0; i < n; ++i) {
dp[i].resize(n, 0);
dp[i][i] = 1;
}
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
int st = i, ed = j;
while (st < ed && s[st] == s[ed]) {
++st;
--ed;
}
dp[i][j] = st >= ed;
}
}
vector<vector<string> > vvs;
vector<string> vs;
dfs(s, 0, vvs, vs);
return vvs;
}
};