【LeetCode-131】分割回文串

问题

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

回文串 是正着读和反着读都一样的字符串。

示例

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

解答

class Solution {
public:
    vector<vector<string>> partition(string s) {
        int n = s.size();
        dp.assign(n, vector<bool>(n, 1));
        for (int i = n - 1; i >= 0; i--)
            for (int j = i + 1; j < n; j++)
                dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1];
        backTrace(s, 0);
        return res;
    }
private:
    vector<vector<string>> res;
    vector<vector<bool>> dp;
    vector<string> ans;
    void backTrace(string& s, int pos) {
        if (pos == s.size()) res.push_back(ans);
        for (int i = pos; i < s.size(); i++) {
            if (!dp[pos][i]) continue;
            ans.push_back(s.substr(pos, i - pos + 1));
            backTrace(s, i + 1);
            ans.pop_back();
        }
    }
};

重点思路

使用动态规划得到所有情况下是否为回文串,再使用回溯得到所有可能的结果。

posted @ 2021-03-09 13:38  tmpUser  阅读(37)  评论(0编辑  收藏  举报