【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;
    }
};
相关推荐
飞Link7 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
xiaoye-duck9 小时前
《C++ 工具库实战》gflags 命令行参数解析库详解
c++·第三方库
一去不复返的通信er9 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
狂奔的sherry10 小时前
C++ 宏生成访问函数的代价:访问权限、调试和类型检查
c++·宏·编译·预处理器·类型检查
Shaoshing10 小时前
LeetCode100 49. 字母异位词分组
java·算法
YFJ_mily10 小时前
第二届区块链技术与基础模型国际学术会议(BTFM2027)
算法·区块链·能源·智能系统·rdlink研发家·机器人自动化
汤姆宝库11 小时前
收官深拆:第一性原理、产业电网与未来推演
大数据·人工智能·算法
划破黑暗的第一缕曙光11 小时前
[C++]:5.STL:string(2)
java·c++·redis
moshuying13 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法