力扣日记1.27-【回溯算法篇】131. 分割回文串
力扣日记:【回溯算法篇】131. 分割回文串
日期:2023.1.27
参考:代码随想录、力扣
131. 分割回文串
题目描述
难度:中等
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]
提示:
- 1 <= s.length <= 16
- s 仅由小写英文字母组成
题解
class Solution {
public:// 关键:将切割问题类比转换为组合问题(树状图)// 但切割与组合最大的不同在于横向遍历时,组合是从集合中取单个值,但切割是截取一个子串 -> for循环时,[startindex, i]表示当前截取的子串(左闭右闭)vector<vector<string>> results; // 组合的集合vector<string> path; // 存储回文子串的组合vector<vector<string>> partition(string s) {backtracking(s, 0);return results;}// 如何判断回文串(双指针,一个从头往后,一个从尾往前,对应相等则为回文串)bool isPalindrome(string s, int startindex, int endindex) {// 左闭右闭while (startindex < endindex) {if (s[startindex] != s[endindex]) {return false;}startindex++;endindex--;}return true;}// 回溯三部曲:// 参数:字符串s以及记录当前截取子串的起始位置startindex(从同一个集合中连续截取,因此需要startindex用于递归纵向遍历)void backtracking(string s, int startindex) {// 终止条件,startindex超过s长度if (startindex == s.size()) { // 左闭,相等即超过// startindex能到最后,说明前面的子串都成功截取为回文串并保存了(否则在for循环将i遍历到最后return)results.push_back(path);return;}// for循环找到回文子串[startindex, i]for (int i = startindex; i < s.size(); i++) {// 是回文子串则截取并递归后面的子串,否则往后遍历找回文子串if (isPalindrome(s, startindex, i)) {// 截取子串并存储path.push_back(s.substr(startindex, i - startindex + 1)); // 注意substr的参数是起始位置以及截取长度backtracking(s, i + 1); // 从i之后的子串递归[i+1, s.size()-1]// 回溯,弹出path.pop_back(); // 之后for向右遍历,尝试截取[startindex, i+1]子串}}}};
复杂度
时间复杂度: O(n * 2^n)
空间复杂度: O(n^2)
思路总结
思路完全参考代码随想录
- 本题实际上算是困难题目
- 难点有以下:
- 将切割问题抽象为组合问题,并转换为树状结构
- 如何模拟那些切割线(如何记录截取子串的始末位置)
- 切割问题中递归如何终止(终止条件)
- 在递归循环中如何截取子串(什么时候该递归,什么时候跳过)
- 如何判断回文
- 将切割问题抽象为组合问题,并转换为树状结构:
-
例如对于字符串abcdef:
组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个…。
切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段…。 - 但切割与组合最大的不同在于横向遍历时,组合是从集合中取单个值[i],但切割是截取一个子串(即[startindex, i])

-
- 如何模拟那些切割线(如何记录截取子串的始末位置)
- for循环时,用[startindex, i]表示当前截取的子串(左闭右闭)
- 递归时,startindex = i + 1表示对i之后的子串进行递归截取
- 切割问题中递归如何终止(终止条件)
- startindex超过s长度(由于左闭右闭,相等即超过)
- 因为startindex能到最后,说明前面的子串都成功截取为回文串并保存了(否则在for循环将i遍历到最后return)
- 在递归循环中如何截取子串(什么时候该递归,什么时候跳过)
- 这里是本题“分割回文串”的特征所在,即处理节点(push_back)时要先确保当前for循环要截取的子串是回文串,才能对后面的子串进行递归;否则应该是循环遍历直到当前子串是回文串或结束for循环
- 即递归与回溯,发生的条件是 当前子串是回文子串(类似于40. 组合总和 II中只有满足“当前取的值不重复”的条件才能递归是一样的。所以也可以写成
for(...) {// 不是回文串则跳过if (!isPalindrome(...)) {continue;}// 递归与回溯... }
- 如何判断回文子串:
- 双指针法, 一个从头往后,一个从尾往前,对应相等则为回文串
- TODO:动态规划优化判断回文子串
相关文章:
力扣日记1.27-【回溯算法篇】131. 分割回文串
力扣日记:【回溯算法篇】131. 分割回文串 日期:2023.1.27 参考:代码随想录、力扣 131. 分割回文串 题目描述 难度:中等 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可…...
如何用web界面打开华为防火墙
目录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录...
力扣20、有效的括号(简单)
1 题目描述 图1 题目描述 2 题目解读 给定的字符串只包含括号,判断这个字符串中的括号是否按照正确顺序出现,即这个字符串是否有效。 3 解法一:栈 C的STL中的stack,在解题时非常好用。 3.1 解题思路 使用栈stk,并枚举…...
Android 系统启动过程
当按下电源时,引导芯片代码会从预定义的地方(固化在ROM) 开始执行,加载引导程序BootLoader到RAM,然后执行。 启动内核的第一个进程idle(pid0),idle进程是Linux系统第一个进程,是init进程和kthreadd进程的父进程。 idle的主要作用 初始化进程以及内存管…...
基于STM32的智能手环设计与实现
需要原理图工程,源码,PCB工程的朋友收藏,这篇文章关注我,私我吧!!! 基于STM32的智能手环设计与实现 摘要一、研究背景及意义二、实现功能三、系统方案设计系统方案设计框图3.1 单片机芯片选择3…...
[BJDCTF2020]The mystery of ip
hint 猜测ip和XFF有关 加一个XFF 下面这一步是看了wp出来的:存在ssti 这里尝试用jinja的注入方法,页面回显了是php的smarty框架 查了一下smarty的注入方法,发现可以直接执行php命令 在根目录找到flag...
RUST笔记:candle使用基础
candle介绍 candle是huggingface开源的Rust的极简 ML 框架。 candle-矩阵乘法示例 cargo new myapp cd myapp cargo add --git https://github.com/huggingface/candle.git candle-core cargo build # 测试,或执行 cargo ckeckmain.rs use candle_core::{Device…...
Python算法题集_接雨水
本文为Python算法题集之一的代码示例 题目42:接雨水 说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]…...
FIND_IN_SET的使用:mysql表数据多角色、多用户查询
MySQL 函数 FIND_IN_SET 是用于在逗号分隔的字符串中查找特定值的函数。它的语法如下: FIND_IN_SET(search_value, comma_separated_string)search_value 是要查找的值。 comma_separated_string 是逗号分隔的字符串,在这个字符串中查找指定的值。FIND_…...
JVM篇----第十一篇
系列文章目录 文章目录 系列文章目录前言一、在新生代-复制算法二、在老年代-标记整理算法三、分区收集算法四、GC 垃圾收集器前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…...
鸿蒙HarmonyOS获取GPS精确位置信息
参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…...
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数 3.58是否为金额:true 3.582是否为金额:false 1284789qq.com是否为email:true 1284789qq.com是否为email࿱…...
php下curl发送cookie
目录 一:使用 CURLOPT_COOKIE 选项 二:CURLOPT_COOKIEFILE 三:CURLOPT_HTTPHEADER php curl发送cookie的几种方式,下面来介绍下 一:使用 CURLOPT_COOKIE 选项 通过设置 CURLOPT_COOKIE 选项,你可以将 cookie 字符…...
stable diffusion学习笔记——文生图(一)
模型设置 基本模型 基本模型也就是常说的checkpoint(大模型),基本模型决定了生成图片的主体风格。 如上图所示,基本模型的后缀为.safetensors。需要存放在特定的文件夹下。 如果用的是启动器,可以在启动器内直接下载。…...
Linux下安装openresty
Linux下安装openresty 十一、Linux下安装openresty11.1.概述11.2.下载OpenResty并安装相关依赖:11.3.使用wget下载:11.4.解压缩:11.5.进入OpenResty目录:11.6.编译和安装11.7.进入OpenResty的目录,找到nginx:11.8.在conf目录下的nginx.conf添…...
【IM】如何保证消息可用性(一)
目录 1. 基本概念1.1 长连接 和 短连接1.2 PUSH模式和PULL模式 2. 背景介绍2.1 理解端到端的思想 3. 方案选型3.1 技术挑战3.2 技术目标 1. 基本概念 在讲解消息可用性之前,需要理解几个通信领域的基本概念。 1.1 长连接 和 短连接 什么是长连接,短连接…...
js直接下载附件和通过blob数据类型下载文件
js下载文件方式有使用a标签的,也有直接用window.open的,还有用form表单的;这里采用的是a标签的下载方式,一种是url直接下载,另一种是文件的blob数据类型进行下载。 文件blob数据类型的获取一般是后端返回文件的二进制流…...
第2章-神经网络的数学基础——python深度学习
第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例,使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是, 将手写数字的灰度图像(28 像素28 像素)划分到 10 个类别 中(0…...
【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
【Docker】Docker学习⑧ - Docker仓库之分布式Harbor 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Docker仓库之单机Dokcer Registry八、 Docker仓库之分布式Harbor1 Harbor功能官方介绍2 安装Harbor…...
一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows
在 wsl-ubuntu 中使用 Docker 启动 Windows 0. 背景1. 验证我的系统是否支持 KVM?2. 使用 Docker 启动 Windows3. 访问 Docker 启动的 Windows4. Docker Hub 地址5. Github 地址 0. 背景 我们可以在 Windows 系统使用安装 wsl-ubuntu,今天玩玩在 wsl-ub…...
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧
LabelImg图像标注工具:3分钟掌握高效目标检测数据标注技巧 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check ou…...
Opyrator UI设计技巧:5个Streamlit自动生成界面教程
Opyrator UI设计技巧:5个Streamlit自动生成界面教程 【免费下载链接】opyrator 🪄 Turns your machine learning code into microservices with web API, interactive GUI, and more. 项目地址: https://gitcode.com/gh_mirrors/op/opyrator Opyr…...
StructBERT情感分类实操手册:自定义示例文本添加方法
StructBERT情感分类实操手册:自定义示例文本添加方法 1. 引言:为什么需要自定义示例? 当你第一次打开StructBERT情感分类的Web界面,可能会觉得它已经内置了不少例子,用起来挺方便。但用着用着,你就会发现…...
VS2019调试配置报错解析:Designtime生成失败与IntelliSense不可用的深度排查指南
1. 问题现象与初步诊断 当你打开VS2019项目时突然弹出"配置Debug|Win32的Designtime生成失败,IntelliSense可能不可用"的红色错误提示,代码编辑窗口里的智能提示全部消失,连最基本的语法高亮都失效了——这种场景我遇到过不下20次。…...
RCE漏洞小结
RCE漏洞简介 所谓RCE漏洞,即Remote Code/Command Execution,远程代码执行和远程命令执行漏洞。在很多Web应⽤中,开发⼈员会使⽤⼀些函数,这些函数以⼀些字符串作为输⼊,功能是将输⼊的字符串当作代码或者命令来进⾏执…...
革新性植物大战僵尸全能修改工具:重定义游戏体验
革新性植物大战僵尸全能修改工具:重定义游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 植物大战僵尸辅助工具PVZ Toolkit是一款专为经典游戏《植物大战僵尸》PC版设计的开源修…...
太原理工大学Web开发历年真题解析:期末复习必备指南(附最新试卷)
太原理工大学Web开发核心考点深度剖析与高效复习方法论 Web开发课程期末备考的战略视角 又到了期末季,作为太原理工大学计算机相关专业的学生,面对Web开发这门实践性极强的课程,你是否还在为如何高效复习而焦虑?不同于传统理论课…...
告别乱码!ESP32-S3+LVGL 9.2.2驱动ILI9488显示中文的保姆级教程(附完整代码)
ESP32-S3LVGL 9.2.2中文显示实战:从乱码到完美呈现的终极指南 当你在ESP32-S3上成功驱动了ILI9488显示屏,LVGL的基础例程也跑起来了,却发现中文显示全是方块或乱码时,这种挫败感我深有体会。中文显示问题一直是嵌入式GUI开发中的…...
Meta2d.js终极指南:从零构建专业级Web SCADA与数字孪生应用
Meta2d.js终极指南:从零构建专业级Web SCADA与数字孪生应用 【免费下载链接】meta2d.js The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so on. Meta2d.js是一个实时数…...
7个赛车数据分析实用技巧:Python F1赛事数据处理实战指南
7个赛车数据分析实用技巧:Python F1赛事数据处理实战指南 【免费下载链接】Fast-F1 FastF1 is a python package for accessing and analyzing Formula 1 results, schedules, timing data and telemetry 项目地址: https://gitcode.com/GitHub_Trending/fa/Fast-…...
