131. 分割回文串

问题

给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

分析

子问题是处理string s[x...n-1],显然,有多种切割方法,所以dfs中进行for循环枚举切割点,判断切割得到的左边串是否回文,如果回文,传递右边串继续dfs;如果不回文,continue该切割点。每次dfs时,传递还未处理的字符串,或者传递新串开始的索引即可。

代码

class Solution {
public:
    string s;
    int s_n;
    vector<vector<string> > res;
    int f[19][19];
    void dfs(vector<string> v_temp,int x) { // x是起点
        if (x == s_n) {
            res.push_back(v_temp);
            return ;
        }
        for (int i = x; i < s_n; i++) {
            if (!f[x][i]) {continue;}
            v_temp.push_back(s.substr(x, i-x+1));
            dfs(v_temp, i+1); // 注意这里是+1
            v_temp.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        this->s = s;
        s_n = s.size();
        memset(f, 1, sizeof f);
        for (int i = s_n-1; i >= 0; i--) {
            for (int j = i+1; j < s_n; j++) {
                // f[a][b]当a > b时都设置为true,可避免复杂的判断
                f[i][j] = f[i+1][j-1] && (s[i] == s[j]);
            }
        }
        vector<string> v_temp;
        dfs(v_temp, 0);
        return res;        
    }
};
posted @ 2025-06-06 13:03  saulstavo  阅读(12)  评论(0)    收藏  举报