Leetcode:分割回文串

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

回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:
输入:s = "a"
输出:[["a"]]

判断回文第一反应就是动态规划
然后要把符合条件的回文子串构成的数组加入结果中,利用回溯,一般pop_back()会跟在迭代的后面

class Solution {
private:
    vector<vector<int>> f;
    vector<vector<string>> ret;
    vector<string> ans;
    int n;

public:
    void dfs(const string& s, int start) {
        if (start == n) {
            ret.push_back(ans);
            return;
        }
        //如果上一步没有加入ret当中,证明后面还有字符没有遍历完
        for (int end = start; end < n; ++end) {
            //如果回文数组为true,则进行start的替换,否则继续for 
            if (f[start][end]) {
            	//在判断是否为回文的数组里,如果start~end内的字符能够构成回文
		//则把该字段的字符进行切片 
                ans.push_back(s.substr(start, end - start + 1));
                //往字符串的下一个走,看后面的字符是否能构成回文串 
                dfs(s, end + 1);
                //会保留之前进入数组的值 
                ans.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s) {
        n = s.size();
        //初始化为一个4x4的全1的二维矩阵 
        f.assign(n, vector<int>(n, true));
		
		//判断是否为回文子串,动态规划 
        for (int j = 1; j < n; j++) {
            for (int i = 0; i < j; i++) {
                f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
            }
        }
        dfs(s, 0);
        return ret;
    }
};
posted @   Dreamer_szy  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示