【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;
    }
};
相关推荐
QiLinkOS32 分钟前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
Irissgwe1 小时前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
小白兔奶糖ovo1 小时前
【Leetcode】231. 2的幂
linux·算法·leetcode
xiaoxiaoxiaolll1 小时前
《Light: Science & Applications》合并BIC实现80倍阈值单模运行:超紧凑光子晶体激光器新突破
人工智能·算法·机器学习
Peter·Pan爱编程2 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程
-To be number.wan2 小时前
算法日记 | 暴力枚举
学习·算法
s_w.h2 小时前
【 linux 】动静态库的制作
linux·运维·服务器·算法·bash
不想写代码的星星2 小时前
从分支预测角度看 C++:为什么你的热循环慢得离谱?
c++
过期动态2 小时前
【LeetCode 热题 100】接雨水
java·数据结构·算法·leetcode·职场和发展
春日见2 小时前
5分钟入门强化学习之动态规划算法与实现
大数据·人工智能·python·算法·机器学习·计算机视觉