LeetCode 131. 分割回文串

之前想用回溯递归树怕爆栈,没想到真的可以。。。。

 

主体思想还是利用枚举当前前缀子串进行判定,如果是回文子串则进行后缀的下一次递归判定,如果不是回文子串,放弃当前枚举前缀,重新选取一个前缀;

 

 

如果采用dp进行回文子串的事先判定可能更快一点;

 

采用单纯回溯判定:

class Solution {
public:
    bool check(int st, int la, string& s) {
        while (st < la) {
            if (s[st] != s[la]) {
                return false;
            }
            st++;
            la--;
        }
        return true;
    }

    void fun(int st, int la, vector<vector<string>>& res, vector<string>& re, string& s) {
        if (st ==la) {
            re.push_back(s.substr(st, 1));
            res.push_back(re);
            re.pop_back();
            return;
        }
        else if (st > la) {
            res.push_back(re);
        }
        for (int i = st; i <= la; i++) {
            if (!check(st, i, s))
                continue;
            re.push_back(s.substr(st, i- st + 1));
            fun(i + 1, la, res, re, s);
            re.pop_back();
        }

    }

    vector<vector<string>> partition(string s) {
        vector<vector<string>> res;
        vector<string>re;
        if (s.size() == 0)
            return res;
        fun(0, s.size()-1, res, re, s);
        return res;
    }
};

 

也可以采用dp二维数组来事前判定,从而省去了check函数的判定,这样更快;

posted @ 2021-02-04 17:33  暮云林凌  阅读(47)  评论(0)    收藏  举报