当前位置: 首页 > news >正文

LeetCode 分割回文串(回溯、dp)

131.分割回文串

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

示例 1:

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

示例 2:

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

提示:

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

在求具体的方案数时一般用深搜来解决,尤其是 n 最多只有 16 时,其实已经提醒了用 dfs 来写

通过枚举起点和终点来不断回溯搜索

代码

c++

class Solution {
public:vector<vector<string>> partition(string s) {int n = s.size();s = '|' + s;vector<string> path;vector<vector<string>> ans;auto check = [&](string s) -> bool{string s1 = s, s2 = s;reverse(s2.begin(), s2.end());return s1 == s2;};auto dfs = [&](auto &&self, int u) -> void{if(u > n){ans.push_back(path);return;}for(int i = u;i <= n;i ++){string ss = s.substr(u, i - u + 1);if(check(ss)){path.push_back(ss);self(self, i + 1);path.pop_back();}}};dfs(dfs, 1);return ans;}
};

py

class Solution:def partition(self, s: str) -> List[List[str]]:n = len(s)ans = []path = []def check(s) -> bool:return s == s[::-1]def dfs(x) -> None:if x == n:ans.append(path.copy())returnfor i in range(x, n):if check(s[x : i + 1]):path.append(s[x : i + 1])dfs(i + 1)path.pop()dfs(0)return ans

132.分割回文串 II

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

返回符合要求的 最少分割次数 。

示例 1:

输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1

提示:

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

首先预处理一个 bool 数组出来使得能够快速判断字串 i-j 是否回文。定义 f 数组是前 i 个字符最少要分割几次才能全部回文,如果 g[1][i] 那么直接 f[i] = 0 就行了,否则可以枚举分割点,具体就是枚举 j ∈ [1, i) 作为分割点,如果 g[j + 1][i] == true 则 f[i] = min(f[i], f[j] + 1)

超时代码

class Solution {
public:int minCut(string s) {int n = s.size();s = '|' + s;vector<vector<bool>> g(n + 1, vector<bool>(n + 1, true));vector<int> f(n + 1, INT_MAX);for(int i = 1;i <= n;i ++){for(int j = i;j <= n;j ++){if(i == j) continue;string s1 = s.substr(i, j - i + 1), s2 = s1;reverse(s2.begin(), s2.end());if(s1 != s2) g[i][j] = false;}}for(int i = 1;i <= n;i ++){if(g[1][i]) f[i] = 0;else{for(int j = 1;j < i;j ++) if(g[j + 1][i]){f[i] = min(f[i], f[j] + 1);}}}return f[n];}
};

在预处理部分的 reverse 和 substr 部分会导致超时,那么这时候只需要换成 py 的代码,就可以水过这个数据

代码

from math import *class Solution:def minCut(self, s: str) -> int:n = len(s)s = '|' + sg = [[True] * (n + 1) for _ in range(n + 1)]f = [inf] * (n + 1) for i in range(1, n + 1):for j in range(i, n + 1):if i == j:continueif s[i:j+1] != s[i:j+1][::-1]:g[i][j] = False# print(f"{i}-{j}:{g[i][j]}")for i in range(1, n + 1):if g[1][i]:f[i] = 0else:for j in range(1, i):if g[j+1][i]:f[i] = min(f[i], f[j] + 1)return f[n]

1278.分割回文串 III 

给你一个由小写字母组成的字符串 s,和一个整数 k

请你按下面的要求分割字符串:

  • 首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
  • 接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。

请返回以这种方式分割字符串所需修改的最少字符数。

示例 1:

输入:s = "abc", k = 2
输出:1
解释:你可以把字符串分割成 "ab" 和 "c",并修改 "ab" 中的 1 个字符,将它变成回文串。

示例 2:

输入:s = "aabbc", k = 3
输出:0
解释:你可以把字符串分割成 "aa"、"bb" 和 "c",它们都是回文串。

示例 3:

输入:s = "leetcode", k = 8
输出:0

提示:

  • 1 <= k <= s.length <= 100
  • s 中只含有小写英文字母。

递推,这个问题需要考虑一个二维 f 数组 :使前 i 项 分割成 k 个回文字符串需要修改的最小次数

用一个函数来调用:一个字符串需要修改多少字符变成回文串。初始状态 f[0][0] 就是 0 ,枚举递推即可

代码

c++

class Solution {
public:int palindromePartition(string s, int k) {int n = s.size();if(n == k) return 0;vector<vector<int>> f(n + 1, vector<int>(k + 1, 0x3f3f3f3f));f[0][0] = 0;auto get = [&](string s, int ist, int ed) -> int{int l = ist, r = ed, res = 0;for(;l < r;l ++, r --) if(s[l] != s[r]){res ++;}return res;};for(int i = 1;i <= n;i ++){for(int j = 1;j <= min(i, k);j ++){if(j == 1) f[i][j] = get(s, 0, i - 1);else{for(int z = j - 1;z < i;z ++){f[i][j] = min(f[i][j], f[z][j - 1] + get(s, z, i - 1));}}}}return f[n][k];}
};

py

class Solution:def palindromePartition(self, s: str, k: int) -> int:n = len(s)def get(s, l, r):res = 0while l < r:if s[l] != s[r]:res += 1l, r = l + 1, r - 1return resf = [[inf] * (k + 1) for _ in range(n + 1)]for i in range(1, n + 1):for j in range(1, min(i, k) + 1):if j == 1:f[i][j] = get(s, 0, i - 1)else:for z in range(j - 1, i):f[i][j] = min(f[i][j], f[z][j - 1] + get(s, z, i - 1))return f[n][k]

1745.分割回文串 IV

给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。

当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串 。

示例 1:

输入:s = "abcbdd"
输出:true
解释:"abcbdd" = "a" + "bcb" + "dd",三个子字符串都是回文的。

示例 2:

输入:s = "bcbddxy"
输出:false
解释:s 没办法被分割成 3 个回文子字符串

提示:

  • 3 <= s.length <= 2000
  • s​​​​​​ 只包含小写英文字母。

这个问题跟 || 本质是一样的,只是有一个有一个类似三数之和的枚举技巧,先枚举第一段,然后枚举第二段,剩下的就是第三段,预处理之后 O(1)查询即可

代码

py

from math import *class Solution:def checkPartitioning(self, s: str) -> bool:n = len(s)s = '|' + sg = [[True] * (n + 1) for _ in range(n + 1)]for i in range(1, n + 1):for j in range(i + 1, n + 1):if s[i:j+1] != s[i:j+1][::-1]:g[i][j] = Falsefor i in range(1, n + 1):if g[1][i] == False:continuefor j in range(i + 1, n):if g[i + 1][j] == True and g[j + 1][n] == True:return Truereturn False

加油

相关文章:

LeetCode 分割回文串(回溯、dp)

131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些 子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a","a","b"],["a…...

期权帮|股指期货入门知识:什么是股指期货基差?什么是股指期货价差?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 股指期货入门知识&#xff1a;什么是股指期货基差&#xff1f;什么是股指期货价差&#xff1f; 股指期货的基差与价差是两个重要的价格关系指标&#xff0c;它们反映了现货市场…...

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望&#xff0c;那就是能够在无需复现玩家反馈的卡顿现象时&#xff0c;快速且准确地定位卡顿的根本原因。为了实现这一目标&#xff0c;UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈&#xff0c;旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…...

Python:类型转换和深浅拷贝,可变与不可变对象

int()&#xff1a;转换为一个整数&#xff0c;只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数&#xff0c;只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float()&#xff1a;整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...

Redis——缓存穿透、击穿、雪崩

缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中&#xff0c;导致请求直接到了数据库上&#xff0c;根本没有经过缓存这一层。举个例子&#xff1a;某个黑客故意制造我们缓存中不存在的 key 发起大量请求&#xff0c;导致大量请求落到数据库…...

8.1.STM32_OLED

4.STM32_OLED 跟着江协科大的视频&#xff0c;无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样&#xff0c;存在很多兼容性问题 归根结底就是驱动的问题&#xff01; 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮&#xff0c;示例见文末 请针对自…...

Gartner发布安全运营指标构建指南

如何为安全运营指标构建坚实的基础 安全运营经理需要报告威胁检测、调查和响应计划的有效性&#xff0c;但难以驾驭大量潜在的 SOC 指标。本研究提供了设计针对 SOC 的指标系统的示例和实践。 主要发现 需要清晰、一致的衡量标准来向董事会成员或服务提供商等更广泛的团队传达…...

【赵渝强老师】监控Redis

对运行状态的Redis实例进行监控是运维管理中非常重要的内容&#xff0c;包括&#xff1a;监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...

【Unity】搭建HTTP服务器并解决IP无法访问问题解决

一、核心目标与背景 在Unity中搭建本地HTTP服务器&#xff0c;可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中&#xff0c;开发者常遇到以下问题&#xff1a; ​本机IP无法访问&#xff1a;服务绑定localhost时&#xff0c;局域网设备无法连…...

如何远程访问svn中的URL

简介&#xff1a; 主要opencascade相关知识学习 格言&#xff1a; 万丈高楼平地起 要远程访问 SVN&#xff08;Subversion&#xff09;仓库中的 URL&#xff0c;通常需要以下步骤和注意事项&#xff1a; 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来&#xff0c;解放双手去做更有趣的事&#xff1f;”Free Auto Clicker 就像你的数字小助手&#xff0c;能在任意位置自动重复点击鼠标。从玩游戏到刷网页&#xff0c;这款免费工具让你告别枯燥的重复操作&#xff0c;效率瞬间起飞&#xff01; 你有没有想…...

0005__PyTorch 教程

PyTorch 教程 | 菜鸟教程 离线包&#xff1a;torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...

Unity Burst编译

官网文档&#xff1a;https://docs.unity3d.com/Packages/com.unity.burst1.8/manual/index.html Unity 之Burst 底层原理&#xff1a;https://zhuanlan.zhihu.com/p/623274986 Burst 编译器入门&#xff08;五&#xff09;&#xff1a;https://developer.unity.cn/projects/5e…...

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办&#xff1f;【高频面试题】先检查自身&#xff0c;Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平&#xff0c;做到不仅…...

LabVIEW基于IMAQ实现直线边缘检测

本程序基于 NI Vision Development 模块&#xff0c;通过 IMAQ Find Straight Edges 函数&#xff0c;在指定 ROI&#xff08;感兴趣区域&#xff09; 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI&#xff0c;实时观察识别效果&#xff0c;适用于 高精度视觉检测…...

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型&#xff1a;对对象、XML、数据库等不同数据源使用一致的语法。强类型检查&#xff1a;编译时类型安全&#xff0c;减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

15Metasploit框架介绍

metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化&#xff0c;即框架结构由多个module组成&#xff0c;是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行sheellcode&#xff0c;并且保持…...

NLP如何训练AI模型以理解知识

一、自然语言处理&#xff08;NLP&#xff09;的定义与核心目标 1. 什么是自然语言处理&#xff1f; NLP是计算机科学与人工智能的交叉领域&#xff0c;旨在让机器具备以下能力&#xff1a; • 理解&#xff1a;解析人类语言&#xff08;文本或语音&#xff09;的语法、语义和…...

【树莓派学习】树莓派3B+的安装和环境配置

【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1&#xff09;命令行登录2&#xff09;远程桌面登录3&#xff09;VNC登录&#xff08;推…...

python连接neo4j的方式汇总

python连接neo4j的方式汇总 1.官方驱动&#xff08;neo4j&#xff09;特点代码示例 2. 全功能ORM&#xff08;py2neo&#xff09;特点代码示例 3. 领域驱动设计框架&#xff08;neomodel-odm&#xff09;特点代码示例 4. 异步高性能驱动&#xff08;asyncneo4j&#xff09;特点…...

华尔街量化团队内部文档流出(Perplexity财经数据查询SOP v2.3):含12类高频Query模板+错误码速查表

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity财经数据查询概述 Perplexity 是一款基于大语言模型的智能搜索与知识发现工具&#xff0c;其在财经领域展现出独特优势&#xff1a;它能实时整合权威信源&#xff08;如 SEC、Bloomberg、Reuters、…...

国产ARM主板实战:从设计选型到性能优化的嵌入式开发指南

1. 项目概述&#xff1a;从“能用”到“好用”的国产ARM主板之路最近几年&#xff0c;如果你关注过硬件开发、嵌入式系统或者国产化替代的圈子&#xff0c;一定会频繁听到“国产ARM主板”这个词。它不再是实验室里的样品&#xff0c;而是越来越多地出现在工业控制、边缘计算、智…...

企业号码认证服务:实现座机、手机来电显示公司名称+品牌LOGO

在如今的商业环境下&#xff0c;一通没有身份标识的电话&#xff0c;想要敲开客户的大门已经变得越来越难。反诈意识的普及&#xff0c;让人们对陌生呼叫筑起了厚厚的防御墙。许多企业在开展客户回访、售后跟进或业务接洽时&#xff0c;频繁遭遇拒接、秒挂的窘境。投入了大笔的…...

【Autosar】MCAL - 从零到一的工程配置实战

1. 工程创建&#xff1a;从零搭建MCAL开发环境 第一次打开Autosar配置工具时&#xff0c;面对满屏的选项确实容易发懵。记得我刚接触MCAL配置时&#xff0c;光是工程创建就反复折腾了好几次。下面我就把踩过的坑和验证过的正确姿势分享给大家。 创建新工程时&#xff0c;工程名…...

实测Llama3 8B在国产AI盒子上的推理速度:算丰SG2300x Airbox跑出9.6 token/s

实测Llama3 8B在国产AI盒子上的推理速度&#xff1a;算丰SG2300x Airbox跑出9.6 token/s 当Meta开源Llama3大模型的消息席卷AI社区时&#xff0c;一个更实际的问题浮出水面&#xff1a;如何让这个性能怪兽在边缘设备上真正跑起来&#xff1f;我们拿到搭载算丰SG2300x芯片的Radx…...

别再乱设JVM堆大小了!Elasticsearch 8.x 内存配置保姆级避坑指南

Elasticsearch 8.x 内存配置实战&#xff1a;从GC崩溃到性能巅峰的避坑手册 凌晨三点&#xff0c;服务器告警又一次响起。屏幕上的GC日志像瀑布一样滚动&#xff0c;节点频繁脱离集群&#xff0c;查询延迟突破天际——这可能是每个Elasticsearch运维人员都经历过的噩梦时刻。而…...

蓝桥杯嵌入式备赛:手把手搞定AT24C02 EEPROM读写(附CubeMX配置与常见Bug修复)

蓝桥杯嵌入式竞赛实战&#xff1a;AT24C02 EEPROM高效读写全攻略 1. 赛前准备&#xff1a;理解I2C与EEPROM的核心机制 在蓝桥杯嵌入式竞赛中&#xff0c;AT24C02这类EEPROM器件常被用作非易失性存储解决方案。与常见Flash存储器不同&#xff0c;EEPROM支持字节级擦写&#xf…...

VisualHMI灵敏度调校全攻略:从触摸校准到性能优化

1. 项目概述&#xff1a;从“调参”到“调感”的界面设计进阶在工业HMI&#xff08;人机界面&#xff09;开发领域&#xff0c;尤其是使用像VisualHMI这类图形化设计软件时&#xff0c;“调节灵敏度”这个需求&#xff0c;远不止是拖动一个滑块、输入一个数值那么简单。它背后牵…...

从OBD到功能安全:聊聊Autosar Dem模块里故障数据的‘生老病死’与内存管理策略

从OBD到功能安全&#xff1a;Autosar Dem模块中故障数据的生命周期与内存博弈 当一辆现代汽车在道路上飞驰时&#xff0c;它的电子控制单元(ECU)内部正上演着无数微观的"生存游戏"。在Autosar Dem模块的内存空间中&#xff0c;每一个故障数据都如同有生命的个体&…...

OPPO新时代板凳精神:解码长期主义研发体系与前沿技术人才战略

1. 从“板凳精神”到“微笑前行”&#xff1a;OPPO的研发哲学与人才战略最近&#xff0c;OPPO在五四青年节发布的那支名为《板凳》的品牌片&#xff0c;以及随之公布的超过2000人的技术研发招聘计划&#xff0c;在科技圈里引发了不小的讨论。很多人乍一看&#xff0c;觉得这又是…...