给定一个字符串 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();
            }
        }
    }
};