news 2026/4/23 13:28:32

回溯算法--分割回文串

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
回溯算法--分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]

难点

本题的难点在于

  1. 怎么理解或者实现分割这个概念。
  2. 怎么分割的字符串怎么定义。

分割这个问题类似于组合问题,定义一个startIndex,startIndex指向那个字符就是分割的位置。

for(int i = startIndex; i < s.size(); i ++), 在对字符串进行横向遍历的时候,statrIndex 到 i 的长度不就是分割字符串。

思路

定义参数

vector<vector<string>> result; vector<string> path; // 核心的回溯函数 // s: 输入的原始字符串 // startIndex: 当前遍历的起始位置 void backtracking(const string& s, int startIndex)

递归结束条件

当分割到最后一个字符时,说明已经分割完毕,并且一定有满足条件的path,因为每个每个单个字母一定是回文串。

if(startIndex == s.size()){ // 将当前构造的分割方案 (path) 添加到最终结果 (result) 中 result.push_back(path); return; }

单层递归逻辑

首先判断分割的字符串是否为回文串,如果是,则压入path。如果不是则跳过,继续考察更长的子串。

当考察到回文串的时候,才会继续向下递归。

// 单层搜索逻辑:从 startIndex 开始,向后遍历字符串 for(int i = startIndex; i < s.size(); i ++){ // 判断从 startIndex 到 i 的子串是否是回文串 if(isPalindrome(s, startIndex, i)){ // 如果是回文串,将其加入到当前路径 (path) 中 // s.substr(startIndex, i - startIndex + 1) 截取了从 startIndex 开始,长度为 i - startIndex + 1 的子串 path.push_back(s.substr(startIndex, i - startIndex + 1)); }else{ // 如果不是回文串,则跳过,继续考察更长的子串 continue; } // 递归:进入下一层决策,起始位置变为 i + 1 backtracking(s, i + 1); // 回溯:撤销当前层的选择,将刚刚加入的子串弹出,以便探索其他可能性 path.pop_back(); }

代码

#include<iostream> #include<vector> using namespace std; // 解题的核心类 class Solution { private: vector<vector<string>> result; vector<string> path; // 核心的回溯函数 // s: 输入的原始字符串 // startIndex: 当前遍历的起始位置 void backtracking(const string& s, int startIndex){ // 基本情况(终止条件):如果起始位置已经等于字符串长度, // 说明我们已经找到了一个完整的分割方案 if(startIndex == s.size()){ // 将当前构造的分割方案 (path) 添加到最终结果 (result) 中 result.push_back(path); return; } // 单层搜索逻辑:从 startIndex 开始,向后遍历字符串 for(int i = startIndex; i < s.size(); i ++){ // 判断从 startIndex 到 i 的子串是否是回文串 if(isPalindrome(s, startIndex, i)){ // 如果是回文串,将其加入到当前路径 (path) 中 // s.substr(startIndex, i - startIndex + 1) 截取了从 startIndex 开始,长度为 i - startIndex + 1 的子串 path.push_back(s.substr(startIndex, i - startIndex + 1)); }else{ // 如果不是回文串,则跳过,继续考察更长的子串 continue; } // 递归:进入下一层决策,起始位置变为 i + 1 backtracking(s, i + 1); // 回溯:撤销当前层的选择,将刚刚加入的子串弹出,以便探索其他可能性 path.pop_back(); } } bool isPalindrome(const string& s, int i, int j){ while(i <= j){ if(s[i] != s[j]){ return false; }else{ i ++; j --; } } return true; } public: vector<vector<string>> partition(string s) { result.clear(); path.clear(); backtracking(s, 0); return result; } }; int main(){ Solution S; string s = "abcd"; vector<vector<string>> result = S.partition(s); for(auto row : result){ for(auto cols : row){ cout << cols << " "; // 打印子串 } cout << endl; // 每打印完一种方案后换行 } return 0; // 程序正常退出 }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:46:19

Java 深度解析:从虚拟机到企业级开发的全面指南

Java 深度解析&#xff1a;从虚拟机到企业级开发的全面指南一、Java 语言体系与生态系统全景1.1 Java 发展历程与技术演进历史里程碑&#xff1a;1995年&#xff1a;Java 1.0 发布&#xff0c;提出 "Write Once, Run Anywhere" 理念1998年&#xff1a;Java 2 Platfor…

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

网络安全大赛全方位详解:从入门到夺冠之路

本文涵盖CTF、AWD、实网攻防等各类网络安全竞赛&#xff0c;为你提供完整参赛指南 目录 &#x1f4ca; 一、网络安全大赛全景图 1.1 主流赛事分类 1.2 国内外顶级赛事盘点 &#x1f3af; 二、CTF比赛全解析 2.1 常见题型与技能要求 2.2 CTF比赛技巧进阶 ⚔️ 三、AWD攻防…

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

神仙工具网站,绝了

今天给大家推荐一个不错的工具网站&#xff0c;这个网站整合了日常会用到的一些软件和资源&#xff0c;无需登录&#xff0c;免费下载&#xff0c;有需要的小伙伴一定要及时下载收藏。 30tool 免费软件和资源网站 打开网站之后&#xff0c;界面非常简洁干净&#xff0c;内容却…

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

盘点NeurlPS‘25通用模型结构优化工作,涉及Attention、KV cache、Dense层、归一化等模块

今天这篇文章给大家盘点一下NeurIPS 2025中和模型结构优化相关的工作。这些优化属于相对通用的模型结构优化&#xff0c;可以迁移到各个深度学习领域。优化的结构包括attention计算方式、稀疏attention、KV cache、Dense网络等多个维度。NeurlPS’25的通用模型结构优化更多集中…

作者头像 李华
网站建设 2026/4/22 8:02:57

4MB 轻量化神器!PaintTool SAI Ver2024 二次元插画必备下载安装教程

前言专为二次元插画、漫画创作打造的PaintTool SAI Ver2024&#xff0c;由日本 SYSTEMAX 公司开发&#xff0c;既延续了老版本 “小体积、易操作” 的核心亮点&#xff0c;又升级多项实用功能&#xff0c;无论新手还是专业画师都能快速上手。版本亮点轻量化流畅运行&#xff0c…

作者头像 李华
网站建设 2026/4/18 13:03:16

电商系统开发公司有哪些?

以下是基于2025年权威榜单及行业测评的电商系统开发公司综合推荐&#xff0c;结合技术实力、服务特色、行业适配性等维度分类整理&#xff0c;供企业高效决策参考&#xff1a;一、高端定制开发公司商联达推荐指数&#xff1a;★★★★★核心优势&#xff1a;为企业提供B2B2C/B2…

作者头像 李华