【Hot 100 刷题计划】 LeetCode 131. 分割回文串 | C++ 回溯算法基础切割法

LeetCode 131. 分割回文串

📌 题目描述

题目级别:中等

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

  • 示例 1:

    输入:s = "aab"

    输出:[["a","a","b"],["aa","b"]]

  • 示例 2:

    输入:s = "a"

    输出:[["a"]]


💡 破题思路:DFS 模拟切割线

这道题是典型的组合/分割 问题,非常适合使用回溯算法(DFS)。

我们可以把字符串想象成一条长长的蛋糕,我们要决定在哪里"下刀"。

  1. 递归参数 u:代表我们当前准备切蛋糕的起始位置。
  2. 横向遍历 i :代表我们这一刀切在哪。子串 s[u...i] 就是我们切下来的这一块。
  3. 合法性检验与纵向递归 :如果我们切下来的这一块是回文串,我们就把它装进当前的路径篮子 path 里,然后拿着剩下部分的起始位置 i + 1,继续向深处递归。
  4. 回溯 :当这一条路探索完退回来时,我们需要把刚刚装进篮子的那一块拿出来(path.pop_back()),去尝试其他的切法。

(⚠️ 细节提醒:在 C++ 中传递字符串时,务必使用 const string& s,避免每一次递归都发生大规模的内存拷贝,这是大厂面试的红线!)


💻 C++ 代码实现 (基础双指针判断)

cpp 复制代码
class Solution {
public:
    vector<vector<string>> res;
    vector<string> path;

    vector<vector<string>> partition(string s) {
        dfs(s, 0);
        return res;
    }

    // 优化点:使用 const string& 避免大量字符串拷贝耗时
    void dfs(const string& s, int u)
    {
        // 终止条件:切割线已经到达了字符串的末尾,说明找到了一种完全切分方案
        if (u == s.size())
        {
            res.push_back(path);
            return ;
        }
        
        // i 代表这一刀切下去的位置,切出的子串为 s[u...i]
        for (int i = u; i < s.size(); i ++ )
        {
            // 如果切出来的这一块是回文串,才允许继续往下切
            if (isPart(s, u, i))
            {
                path.push_back(s.substr(u, i - u + 1)); // 处理节点:将回文子串加入路径
                dfs(s, i + 1);                          // 向下递归:从下一截开始继续切
                path.pop_back();                        // 回溯:撤销选择,尝试下一刀切得更长一点
            }
        }
    }

    // 双指针法:判断 s[l...r] 是否为回文串
    bool isPart(const string& s, int l, int r)
    {
        while (l < r) 
        {
            if (s[l ++ ] != s[r -- ]) return false;
        }
        return true;
    }
};
相关推荐
沫璃染墨14 小时前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
打码的老程是远篁14 小时前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风14 小时前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
郝学胜_神的一滴14 小时前
C++ Templates 05:那些容易踩坑的技巧性基础知识
c++·visual studio
用户73416810354814 小时前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法
Ivanqhz14 小时前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习
罗湖老棍子14 小时前
荒岛野人(信息学奥赛一本通- P1637)(洛谷-P2421)
算法·数论·枚举·裴蜀定理·扩展欧几里得·扩展中国剩余定理
朝朝辞暮i14 小时前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
400分14 小时前
具身智能系列之从零到「机械臂会放试管」:π0.5 VLA 真机部署完全指南【第一节】
算法
小宋102114 小时前
一套服务托管多个 LoRA:适配器加载、租户隔离与热切换实战
大数据·人工智能·算法