【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;
    }
};
相关推荐
Tairitsu_H3 小时前
[C++] C++11 Lambda与包装器深度解析
开发语言·c++·c++11·lambda·包装器
傲世仙尊3 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++
小羊没烦恼!4 小时前
Memory 记忆设计讨论:为什么 Agent Memory 不能只靠向量数据库?
java·开发语言·windows·算法·c#
FlightYe4 小时前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
羑悻的小杀马特4 小时前
数据织网者:Jsoncpp库深度解析——从C++原生JSON处理到工程级数据交互实战全攻略
c++·json·交互·jsoncpp·原生库
ysu_03144 小时前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode
咸鱼老弟4 小时前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
果果燕4 小时前
实习笔记(七)GFP自动化插拔测试功能协议解析
c++
荆棘鸟智能4 小时前
AI算法持续学习与迭代怎么做?从数据闭环到灰度发布的MLOps工程实践
人工智能·算法·架构·边缘计算
宁渡AI大模型4 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag