【动态规划】【记忆化搜索】【回文】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 中所有字符都是小写字母。

动态规划

动态规划的状态表示

dpleftr 表示sleft,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 dpleftr=min\begin{cases} dpleft+1r-1 & sleft==sr \\ dpleft+1r+1 & \\ dpleftr-1+1 & \\ \end{cases} dpleftr=min⎩ ⎨ ⎧dpleft+1r−1dpleft+1r+1dpleftr−1+1sleft==sr

用Cal函数代替dp向量:一,方便记忆。二,方便处理left > r。

动态规划的初始值

全为-1,表示未处理。

动态规划的填表顺序

递归计算dp0n-1

动态规划的返回值

dp0n-1

代码

核心代码

cpp 复制代码
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);
	};
};

测试用例

cpp 复制代码
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++)

{

dp1j = 1;

}

for (int len = 2; len <= c; len++)

{

for (int i = 0; i + len <= c; i++)

{

dpleni = max(dplen-1i ,dplen-1i+1);

if (si == si + len - 1)

{

dpleni = max(dpleni, 2 + dplen - 2i + 1);

}

}

}

return dpc0;

}

};

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++ )

{

dpj = max(prej, dpj - 1);

if (text2i - 1 == text1j - 1)

{

dpj = max(dpj, prej - 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_resultij = -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_resultleftr;

if (-1 != result)

{

return result;

}

if (sleft == sr - 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_result501501;

};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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++**实现。

相关推荐
傻啦嘿哟8 分钟前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅1 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
wenyq71 小时前
LeetCode 2460. Apply Operations to an Array
算法·leetcode
闻道且行之1 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
.格子衫.2 小时前
032动态规划之区间DP——算法备赛
算法·动态规划
莫浅子2 小时前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
不会代码的小猴3 小时前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨3 小时前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5
怪奇云呼军3 小时前
知识库也会注入指令?闪电智能VoiceAgent 如何防住 Prompt Injection
人工智能·python·算法·云计算·音视频
阿里云大数据AI技术4 小时前
基于 EMR Serverless Ray 实现 Qwen 模型批量推理实践
人工智能·算法·agent