classSolution { public: vector<vector<string>> partition(string s) { int n = s.length(); isPalin.resize(n, vector<bool>(n)); computeIsPalin(s); dfs(s, 0); return res; }
voidcomputeIsPalin(conststring &s){ int n = s.length(); for (int i = 0; i < n; ++i) { isPalin[i][i] = true; } for (int i = 0; i < n - 1; ++i) { isPalin[i][i + 1] = (s[i] == s[i + 1]); } for (int len = 2; len <= n; ++len) { for (int i = 0, j = i + len; i < n && j < n; ++i, ++j) { isPalin[i][j] = isPalin[i + 1][j - 1] && (s[i] == s[j]); } } }
voiddfs(conststring &s, int b){ if (b == s.length()) { res.push_back(v); } for (int i = b; i < s.length(); ++i) { if (isPalin[b][i]) { v.push_back(s.substr(b, i + 1 - b)); dfs(s, i + 1); v.pop_back(); } } }