《代码随想录》Ⅶ 回溯算法-分割 131. 分割回文串

《代码随想录》Ⅶ 回溯算法-分割 131. 分割回文串

努力学习!

题目:力扣链接

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

一、思想

这道题的核心思想是使用回溯算法来生成所有可能的回文子串分割方案。回溯算法通过递归的方式,逐步构建解空间树,并在过程中进行剪枝,以避免无效的搜索。具体来说,我们从字符串的起始位置开始,尝试将其分割成不同的子串,并检查这些子串是否为回文串。如果是回文串,则将其加入当前分割方案,并递归地处理剩余的字符串。如果当前分割方案中的所有子串都是回文串,则将其加入结果集。

二、代码

class Solution
{
public:
    vector<vector<string>> res;
    vector<string> path;

    bool isPalindromic(string &str, int left, int right)
    {
        for (int i = left, j = right; i < j; ++i, --j) {
            if (str[i] != str[j]) {
                return false;
            }
        }
        return true;
    }

    void backtracking(string str, int start)
    {
        if (start > str.size()) {
            res.push_back(path);
            return;
        }

        for (int i = start; i < str.size(); ++i) {
            if (isPalindromic(str, start, i)) {
                string s = str.substr(start, i - start + 1);
                path.push_back(s);
            }
            else {
                continue;
            }
            backtracking(str, i + 1);
            path.pop_back();
        }
    }

    vector<vector<string>> partition(string s)
    {
        res.clear();
        path.clear();
        backtracking(s, 0);
        return res;
    }
};

三、代码解析

1. 算法工作原理分解

1.1 回溯函数 backtracking
  • 目的:递归地生成所有可能的回文子串分割方案。

  • 实现

    • 终止条件

      • 如果 start​ 大于字符串 str​ 的长度,说明当前分割方案中的所有子串都是回文串,将当前分割方案 path​ 添加到结果集 res​ 中。
    • 选择与递归

      • start​ 开始遍历字符串 str​,尝试将其分割成不同的子串。
      • 如果当前子串 str[start:i+1]​ 是回文串,则将其加入当前分割方案 path​ 中。
      • 递归调用 backtracking​,并更新起始位置为 i + 1​,继续处理剩余的字符串。
    • 回溯

      • 在递归调用返回后,将当前子串从 path​ 中移除,以便尝试其他可能的分割方案。
1.2 回文判断函数 isPalindromic
  • 目的:判断给定子串是否为回文串。

  • 实现

    • 使用双指针法,从子串的两端向中间遍历,检查对应字符是否相等。如果所有字符都相等,则子串是回文串。
1.3 分割生成函数 partition
  • 目的:初始化并调用回溯函数,生成所有可能的回文子串分割方案。

  • 实现

    • 初始化:清空结果集 res​ 和当前分割方案 path​。
    • 调用回溯函数:从字符串的第一个字符开始,调用 backtracking​ 函数生成所有可能的分割方案。
    • 返回结果:返回生成的所有分割方案。

2. 关键点说明

2.1 路径的选择与回溯
  • 路径path​ 变量用于存储当前正在生成的分割方案。
  • 选择:每次选择一个回文子串并将其添加到 path​ 中。
  • 回溯:在递归调用返回后,将当前子串从 path​ 中移除,以便尝试其他可能的分割方案。
2.2 结果集的存储
  • 结果集res​ 变量用于存储所有符合条件的回文子串分割方案。
  • 添加条件:当 path​ 中的所有子串都是回文串时,将 path​ 添加到 res​ 中。
2.3 剪枝优化
  • 剪枝:在递归过程中,如果当前子串不是回文串,则直接跳过,避免无效的搜索。

四、复杂度分析

  • 时间复杂度O(N * 2^N)

    • 其中 N​ 是字符串 s​ 的长度。最坏情况下,字符串的每个字符都可以作为分割点,因此时间复杂度为 O(N * 2^N)​。
  • 空间复杂度O(N)

    • 递归调用栈的深度最多为 N​,因此空间复杂度为 O(N)​。此外,结果集 res​ 的空间复杂度为 O(2^N)​,但在通常情况下,我们只考虑递归栈的空间复杂度。

白展堂:人生就是这样,苦和累你总得选一样吧?哪有什么好事都让你一个人占了呢。 ——《武林外传》

内容概要:本文系统阐述了基于双层优化的微电网系统规划设计方法,结合Matlab代码实现,深入探讨了微电网中储能配置、分布式能源接入、经济调度及不确定性处理等关键问题。通过构建上层规划与下层运行协同优化的双层模型,综合运用Benders分解、粒子群算法(PSO)、遗传算法(GA)等智能优化技术,实现系统投资成本与运行成本的联合最小化,并提升微电网在复杂环境下的运行效率与可靠性。文中提供了完整的仿真代码与典型算例分析,涵盖模型构建、求解流程与结果可视化,便于读者复现与拓展研究。; 适合人群:具备电力系统基础理论知识和一定Matlab编程能力的高校研究生、科研人员及从事微电网、综合能源系统设计与优化的工程技术人员,特别适用于正在开展相关课题研究或撰写高水平学术论文的研究者。; 使用场景及目标:①应用于微电网系统的容量规划、设备选址定容与多时间尺度运行优化;②支撑科研项目中双层优化模型的开发与算法验证,提升研究的技术深度与工程实用性;③辅助完成顶刊论文的复现工作,并在此基础上进行创新性方法改进与性能对比分析; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,重点理解双层优化模型的数学建模思想、变量耦合关系与迭代求解机制,同时可参考其他相关案例(如风光储氢系统、电动汽车协同调度)进行横向对比学习,以全面掌握智能优化算法在现代能源系统中的应用范式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值