5.分割回文串Ⅰ-中等-动态规划回溯

题目描述

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

示例一:

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

示例二:

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

思路

使用一个数组保存区间[i, j]内的子串回文状况,动态规划转移条件:

f[i][j] = true;
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1] (i = j + 1, 可写成与下面一样的形式,i+1 > j-1 有f[i+1][j-1] = true)
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1]     (i >= j + 2)

回溯:
枚举每个子串的回文情况,将所有回文子串组合加入到结果中,终止条件是枚举位置等于字符串长度。

代码

class Solution{
private:
    vector<string> path;
    vector<vector<string>> ans;
    vector<vector<bool>> f;
    int n;
public:
    void dfs(string& s, int i){
        if(i == n){
            ans.push_back(path);
            return;
        }
        for(int j = i; j < n; j++){
            if(f[i][j]){
                path.push_back(s.substr(i, j - i + 1));
                dfs(s, j + 1);
                path.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s) {
        int n = s.size();
        f.resize(n, vector<bool>(n, true));
        
        for(int i = n - 2; i >= 0; i--){
            for(int j = i + 1; j < n; j++){
                f[i][j] = (s[i] == s[j]) && f[i+1][j-1];
            }
        }
        dfs(s, 0);
        return ans;
    }
};
posted @ 2021-08-23 16:00  什么名字比较好  阅读(167)  评论(0)    收藏  举报