给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
class Solution {
public:
vector<vector<string>> res;
vector<string> sol;
vector<vector<string>> partition(string s) {
if (s.empty())
return {{}};
int n = s.length();
vector<vector<bool>> f;
f.resize(n, vector<bool>(n, false));
for (int k = 0; k < n; ++k)
{
for (int i = k, j = k; i >= 0 && j < n && s[i] == s[j]; --i, ++j)
f[i][j] = true;
for (int i = k - 1, j = k; i >= 0 && j < n && s[i] == s[j]; --i, ++j)
f[i][j] = true;
}
dfs(s, f, 0);
return res;
}
void dfs(string& s, vector<vector<bool>>& f, int idx) {
if (idx == s.length() && !sol.empty())
{
res.push_back(sol);
return;
}
for (int i = idx; i < s.length(); ++i)
{
if (f[idx][i])
{
sol.push_back(s.substr(idx, i - idx + 1));
dfs(s, f, i + 1);
sol.pop_back();
}
}
}
};