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,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1: 输入:s "aab" 输出:[["a","a","b"],["a…...

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

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

Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...

Redis——缓存穿透、击穿、雪崩
缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...

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

【赵渝强老师】监控Redis
对运行状态的Redis实例进行监控是运维管理中非常重要的内容,包括:监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...
【Unity】搭建HTTP服务器并解决IP无法访问问题解决
一、核心目标与背景 在Unity中搭建本地HTTP服务器,可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中,开发者常遇到以下问题: 本机IP无法访问:服务绑定localhost时,局域网设备无法连…...
如何远程访问svn中的URL
简介: 主要opencascade相关知识学习 格言: 万丈高楼平地起 要远程访问 SVN(Subversion)仓库中的 URL,通常需要以下步骤和注意事项: 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...

Free Auto Clicker - 在任意位置自动重复鼠标点击
“想让鼠标自己动起来,解放双手去做更有趣的事?”Free Auto Clicker 就像你的数字小助手,能在任意位置自动重复点击鼠标。从玩游戏到刷网页,这款免费工具让你告别枯燥的重复操作,效率瞬间起飞! 你有没有想…...
0005__PyTorch 教程
PyTorch 教程 | 菜鸟教程 离线包:torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...

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

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

LabVIEW基于IMAQ实现直线边缘检测
本程序基于 NI Vision Development 模块,通过 IMAQ Find Straight Edges 函数,在指定 ROI(感兴趣区域) 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI,实时观察识别效果,适用于 高精度视觉检测…...
C#:LINQ学习笔记01:LINQ基础概念
一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...

15Metasploit框架介绍
metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化,即框架结构由多个module组成,是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行sheellcode,并且保持…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...

【树莓派学习】树莓派3B+的安装和环境配置
【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1)命令行登录2)远程桌面登录3)VNC登录(推…...
python连接neo4j的方式汇总
python连接neo4j的方式汇总 1.官方驱动(neo4j)特点代码示例 2. 全功能ORM(py2neo)特点代码示例 3. 领域驱动设计框架(neomodel-odm)特点代码示例 4. 异步高性能驱动(asyncneo4j)特点…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...