【动态规划】【记忆化搜索】【回文】1312让字符串成为回文串的最少插入次数

作者推荐

【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数

本文涉及知识点

动态规划汇总
记忆化搜索 回文 字符串

LeetCode1312. 让字符串成为回文串的最少插入次数

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。
请你返回让 s 成为回文串的 最少操作次数 。
「回文串」是正读和反读都相同的字符串。
示例 1:
输入:s = “zzazz”
输出:0
解释:字符串 “zzazz” 已经是回文串了,所以不需要做任何插入操作。
示例 2:
输入:s = “mbadm”
输出:2
解释:字符串可变为 “mbdadbm” 或者 “mdbabdm” 。
示例 3:
输入:s = “leetcode”
输出:5
解释:插入 5 个字符后字符串变为 “leetcodocteel” 。
提示:
1 <= s.length <= 500
s 中所有字符都是小写字母。

动态规划

动态规划的状态表示

dp[left][r] 表示s[left,r]变成回文需要插入的字符数。

动态规划的转移方程

d p [ l e f t ] [ r ] = m i n { d p [ l e f t + 1 ] [ r − 1 ] s [ l e f t ] = = s [ r ] d p [ l e f t + 1 ] [ r ] + 1 d p [ l e f t ] [ r − 1 ] + 1 dp[left][r]=min\begin{cases} dp[left+1][r-1] & s[left]==s[r] \\ dp[left+1][r]+1 & \\ dp[left][r-1]+1 & \\ \end{cases} dp[left][r]=min dp[left+1][r1]dp[left+1][r]+1dp[left][r1]+1s[left]==s[r]
用Cal函数代替dp向量:一,方便记忆。二,方便处理left > r。

动态规划的初始值

全为-1,表示未处理。

动态规划的填表顺序

递归计算dp[0][n-1]

动态规划的返回值

dp[0][n-1]

代码

核心代码

class Solution {
public:
	int minInsertions(string s) {
		const int n = s.length();
		vector<vector<int>> dp(n, vector<int>(n, -1));
		return Cal(dp,s,0, n - 1);
	}
	int Cal (vector<vector<int>>& dp ,const string& s,int left, int r)
	{
		if (left > r)
		{
			return 0;
		}
		if (-1 != dp[left][r])
		{
			return dp[left][r];
		}
		if (s[left] == s[r])
		{
			return dp[left][r] = Cal(dp,s,left + 1, r - 1);
		}
		return dp[left][r] = min(Cal(dp, s, left + 1, r) + 1, Cal(dp, s, left, r - 1) + 1);
	};
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}

}

int main()
{	
	string s;
	{
		Solution sln;
		s = "zzazz";
		auto res = sln.minInsertions(s);
		Assert(0, res);
	}

	{
		Solution sln;
		s = "mbadm";
		auto res = sln.minInsertions(s);
		Assert(2, res);
	}

	{
		Solution sln;
		s = "leetcode";
		auto res = sln.minInsertions(s);
		Assert(5, res);
	}
}

2023年2月第一版

class Solution {
public:
int minInsertions(string s) {
return s.length() - MaxNum(s);
}
int MaxNum(string s)
{
int c = s.length();
vector<vector> dp(c+1, vector©);
for (int j = 0; j < c; j++)
{
dp[1][j] = 1;
}
for (int len = 2; len <= c; len++)
{
for (int i = 0; i + len <= c; i++)
{
dp[len][i] = max(dp[len-1][i] ,dp[len-1][i+1]);
if (s[i] == s[i + len - 1])
{
dp[len][i] = max(dp[len][i], 2 + dp[len - 2][i + 1]);
}
}
}
return dp[c][0];
}
};

2023年2月 第二版

class Solution {
public:
int minInsertions(string s) {
string strInv(s.rbegin(), s.rend());
return s.length() - longestCommonSubsequence(s, strInv);
}
int longestCommonSubsequence(string text1, string text2) {
vector pre(text1.size()+1);
for (int i = 1; i <= text2.length(); i++)
{
vector dp(text1.size() + 1);
for (int j = 1; j <= text1.size();j++ )
{
dp[j] = max(pre[j], dp[j - 1]);
if (text2[i - 1] == text1[j - 1])
{
dp[j] = max(dp[j], pre[j - 1]+1);
}
}
pre.swap(dp);
}
return pre.back();
}
};

2023年7月版

class Solution {
public:
int minInsertions(string s) {
for (int i = 0; i <= s.length(); i++)
{
for (int j = 0; j <= s.length(); j++)
{
m_result[i][j] = -1;
}
}
return minInsertions(s, 0, s.length());
}
//左闭右开
int minInsertions(const string& s, int left, int r)
{
if (r - left <= 1)
{
return 0;
}
int& result = m_result[left][r];
if (-1 != result)
{
return result;
}
if (s[left] == s[r - 1])
{
return result =minInsertions(s, left + 1, r - 1);
}
return result = 1 + min(minInsertions(s, left + 1, r), minInsertions(s, left, r - 1));
}
int m_result[501][501];
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367089.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32--USART串口(1)串口协议

一、通信接口 全双工&#xff1a;通信双方能够同时进行双向通信&#xff1b; 半双工&#xff1a;通信双方能够进行双向通信&#xff0c;但不能同时通信&#xff1b; 单工&#xff1a;只能从一个设备到另一个设备&#xff1b; 同步&#xff1a;接收方可以在时钟信号的指引下进…

解决Docker打包Eureka注册中心,其他服务无法注册问题

​前言 本文主要是介绍利用docker打包Eureka注册中心&#xff0c;并且发布镜像到服务器&#xff0c;遇到的一个比较坑的问题。主要是服务镜像部署完毕之后&#xff0c;docker容器都能启动&#xff0c;并且也能访问&#xff0c;但是其他服务就是无法注册到注册中心。排除问题&a…

Vite与Webpack打包内存溢出问题优雅处理方式

Vite与Webpack打包内存溢出问题处理 文章目录 Vite与Webpack打包内存溢出问题处理1. Vite1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系统的环境变量 2. Webpack1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系…

华为OD机试真题【日志首次上报最多积分】

1、题目描述 【日志首次上报最多积分】 日志采集是运维系统的的核心组件。日志是按行生成&#xff0c;每行记做一条&#xff0c;由采集系统分批上报。 如果上报太频繁&#xff0c;会对服务端造成压力;如果上报太晚&#xff0c;会降低用户的体验&#xff1b; 如果一次上报的…

bash脚本学习笔记

一、扫盲 脚本文件是一种文本文件&#xff0c;其中包含了一系列的命令和指令&#xff0c;可以被操作系统解释器直接解释执行。脚本文件通常被用来完成特定的任务或执行重复性的操作。 脚本文件通常以某种编程语言的语法编写&#xff0c;例如 Bash、Python、Perl、Ruby 等等。…

多线程-阻塞队列(超详细)

目录 1.阻塞队列是什么 生产者-消费者模型 2.标准库中的阻塞队列 ⽣产者-消费者模型 阻塞队列实现 1.阻塞队列是什么 阻塞队列&#xff08;Blocking Queue&#xff09;是一种特殊类型的队列&#xff0c;它在插入和删除元素时可以提供阻塞机制。阻塞队列能是⼀种线程安全的数…

769933-15-5,Biotin aniline,用来标记和检测细胞膜上的特定蛋白质

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺 一、基本信息 产品简介&#xff1a;Biotin aniline, also known as Biotin aniline, is a molecular probe with strong reactivity. Its uniqueness…

​(四)hive的搭建2

在&#xff08;三&#xff09;hive的搭建1中我们搭建好了hive环境&#xff0c;但是只能本地访问&#xff0c;在本节中配置Hive的访问方式。 1.元数据服务的方式 1.1 编辑hive-site.xml sudo vi hive-site.xml 在文件最后增加以下内容 <!– 指定存储元数据要连接的地址 –…

RTSP/Onvif协议视频平台EasyNVR激活码授权异常该如何解决

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…

反物质(anti matter)和湮灭反应(Annihilation)浅读

反物质 反物质是正常物质的反状态。当正反物质相遇时&#xff0c;双方就会相互湮灭抵消&#xff0c;发生爆炸并产生巨大能量。 概念 正电子、负质子都是反粒子&#xff0c;它们跟通常所说的电子、质子相比较&#xff0c;电量相等但电性相反。科学家设想在宇宙中可能存在完全由…

自然语言nlp学习五

6-10 文本生成--介绍_哔哩哔哩_bilibili 在自然语言处理&#xff08;NLP, Natural Language Processing&#xff09;领域&#xff0c;“sequence”通常是指一个有序的数据集合&#xff0c;它由一系列元素按照特定顺序排列而成。这些元素可以是单词、字符、句子或其他文本单位。…

Web实战丨基于django+hitcount的网页计数器

文章目录 写在前面Django简介主要程序运行结果系列文章写在后面 写在前面 本期内容 基于djangohitcount的网页计数器 所需环境 pythonpycharm或vscodedjango 下载地址 https://download.csdn.net/download/m0_68111267/88795611 Django简介 Django 是一个开源的、基于 …

聊聊DoIP吧(一)

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…

闲聊电脑(4)硬盘分区

夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次你说的那个“分区”和“格式化”是什么意思&#xff1f; 冰箱&#xff1a;分区么&#xff0c;就是分…

基于WordPress开发微信小程序1:搭建Wordpress

2年前&#xff0c;在知乎上提问&#xff1a;多数公司为什么宁愿自研也不用wordpress二次开发建站&#xff1f; - 知乎 (zhihu.com)&#xff0c;收到了&#xff0c;很多回答 自己打算做一下提升&#xff0c;便有了自己基于wordpress开发微信小程序的想法 项目定位 基于wordpre…

【机器学习】科学库使用手册第2篇:机器学习任务和工作流程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论人工智能相关知识。主要内容包括&#xff0c;了解机器学习定义以及应用场景&#xff0c;掌握机器学习基础环境的安装和使用&#xff0c;掌握利用常用的科学计算库对数据进行展示、分析&#xff0c;学会使用jupyter note…

MATLAB知识点: 矩阵元素的修改和删除

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.3.3 矩阵元素的修改和删除 我们可以直接利用等…

记录关于node接收上传文件formData踩的坑

1.vue2使用插件formidable实现接收文件&#xff0c;首先接口不可以使用任何中间件&#xff0c;否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

定义HarmonyOS IDL接口

HarmonyOS IDL简介 HarmonyOS Interface Definition Language&#xff08;简称HarmonyOS IDL&#xff09;是HarmonyOS的接口描述语言。HarmonyOS IDL与其他接口语言类似&#xff0c;通过HarmonyOS IDL定义客户端与服务端均认可的编程接口&#xff0c;可以实现在二者间的跨进程…