news 2026/4/23 19:21:56

day154—回溯—分割回文串(LeetCode-131)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day154—回溯—分割回文串(LeetCode-131)

题目描述

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

示例 1:

输入:s = "aab"输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s仅由小写英文字母组成

解决方案:

这段代码的核心功能是将一个字符串分割成若干个子串,且每个子串都是回文串,输出所有可能的分割方案(比如输入 "aab",输出[["a","a","b"],["aa","b"]]),采用「回溯 + 回文校验」的思路实现,是字符串回文分割问题的经典解法。

核心逻辑

  1. 成员变量作用

    • t:临时数组,存储当前正在构造的回文分割方案(比如分割到某一步时,t 可能是 ["a","a"]);
    • ans:最终结果数组,存储所有合法的回文分割方案;
    • tmp:未使用的临时变量(可删除,不影响功能)。
  2. 辅助函数isPalindrome

    • 功能:校验字符串s中从leftright的子串是否为回文(正读和反读一致);
    • 实现:双指针从两端向中间遍历,逐一对比字符,只要有一对不相等就返回 false,否则返回 true。
  3. 递归函数dfs逻辑

    • 参数curr:表示当前分割的起始位置(从字符串的第curr位开始尝试分割);str:待分割的原始字符串;
    • 终止条件:当curr == str.size()时,说明已经把字符串完整分割完毕,此时t就是一个合法的分割方案,将其加入ans后返回;
    • 核心流程(枚举分割点 + 回溯):① 遍历从curr到字符串末尾的所有位置jj是当前分割的结束位置);② 校验:如果str[curr, j]区间的子串是回文,则将该子串加入临时数组t;③ 递归:以j+1为新的起始位置,继续分割剩余的字符串;④ 回溯:递归返回后,执行t.pop_back()删掉刚加入的子串,尝试下一个分割点。
  4. 主函数partition

    • 从起始位置0调用dfs,启动递归分割过程;
    • 最终返回存储所有合法分割方案的ans

关键特点

  • 核心思想:通过「枚举分割点 + 回文校验」,确保每一步分割出的子串都是回文,再递归处理剩余部分,回溯保证能尝试所有可能的分割方式;
  • 去重逻辑:分割点jcurr开始遍历,保证分割顺序是 “从左到右不回头”,避免生成重复的分割方案(比如不会出现 ["b","aa"] 这种逆序分割,因为curr会逐步后移)。

总结

  1. 核心思路:递归枚举所有可能的分割点,仅保留 “分割出的子串是回文” 的分支,递归到底时收集完整的分割方案;
  2. 关键操作:isPalindrome校验回文是前提,t.push_back()(记录合法分割)和t.pop_back()(回溯)是实现所有方案遍历的核心;
  3. 功能效果:能输出字符串的所有 “全回文子串” 分割方案,无重复、无遗漏。

以输入 "aab" 为例,最终会生成两种合法方案:

  • 分割为 ["a","a","b"](每一步分割的子串 "a"、"a"、"b" 都是回文);
  • 分割为 ["aa","b"](子串 "aa"、"b" 都是回文)。

函数源码:

class Solution { public: vector<string> t; vector<vector<string>> ans={}; string tmp; bool isPalindrome(const string& s, int left, int right) { while (left < right) { if (s[left++] != s[right--]) { return false; } } return true; } void dfs(int curr,string str){ int len = str.size(); if(curr==len){ ans.push_back(t); return ; } for(int j=curr;j<len;j++){ if(isPalindrome(str,curr,j)){ t.push_back(str.substr(curr, j - curr + 1)); // 分割! dfs(j+1,str); t.pop_back(); } } } vector<vector<string>> partition(string s) { dfs(0,s); return ans; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:14:44

day155—回溯—组合(LeetCode-77)

题目描述给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1&#xff1a;输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#xff1a;输入&#xff1a;n 1, k 1 …

作者头像 李华
网站建设 2026/4/23 11:19:18

计算机小程序毕设实战-基于django+微信小程序的运动饮食健康生活系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 9:59:22

汽车ABS模型仿真:探索防抱死制动系统建模之旅

汽车ABS模型仿真&#xff0c;防抱死制动系统建模 包括simulink建立的汽车ABS模型和Word文档详细说明如何对防抱死制动系统 (ABS) 进行建模。 它对车辆在紧急制动情况下的动态行为进行仿真。 仿真分析包括 在 ABS 模式下运行仿真、在无 ABS 的情况下运行仿真、带 ABS 的制动与不…

作者头像 李华
网站建设 2026/4/23 11:20:45

西门子S7200smart PLC与三菱FX3u PLC 的485 Modbus RTU通信之旅

西门子S7200smartPLC与三菱FX3uPlc做485Modbus RTU通信&#xff0c;西门子S7200smartPLC做主站轮训扫描读取写去数据转入三菱Plc&#xff01;通信已测试没有问题&#xff0c;最近成功实现了西门子S7200smart PLC与三菱FX3u PLC 通过485 Modbus RTU进行通信&#xff0c;并且西门…

作者头像 李华
网站建设 2026/4/23 9:55:27

文件系统(理解机械磁盘)

理解硬件&#xff1a;磁盘1.机械磁盘机械磁盘是计算机中唯一的一个机械设备&#xff0c;本节提到的磁盘均为机械磁盘2.磁盘物理结构3.磁盘的存储结构一个磁盘有数个盘&#xff0c;每个盘有两个盘面&#xff0c;每个盘面上都有磁头可以进行读写&#xff0c;每一个盘面上都有数个…

作者头像 李华
网站建设 2026/4/23 9:53:26

2026降AI工具红黑榜:实测8款后我只推荐这3个

2026降AI工具红黑榜&#xff1a;实测8款后我只推荐这3个 TL;DR&#xff1a;测了8款降AI工具&#xff0c;踩了不少坑。红榜推荐&#xff1a;嘎嘎降AI&#xff08;达标率99.26%&#xff0c;性价比最高&#xff09;、比话降AI&#xff08;不达标全额退款&#xff09;、AIGCleaner&…

作者头像 李华