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

2023-12-01 04:18

本文主要是介绍LeetCode —— 1312. 让字符串成为回文串的最少插入次数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目描述
  • 示例
    • 示例一
    • 示例二
    • 示例三
    • 示例四
    • 示例五
  • 解题思路
  • 代码呈现
  • 参考文献

题目描述

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。

请你返回让 s 成为回文串的 最少操作次数 。

「回文串」是正读和反读都相同的字符串。

示例

示例一

输入:s = "zzazz"
输出:0
解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。

示例二

输入:s = "mbadm"
输出:2
解释:字符串可变为 "mbdadbm" 或者 "mdbabdm"

示例三

输入:s = "leetcode"
输出:5
解释:插入 5 个字符后字符串变为 "leetcodocteel"

示例四

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

示例五

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

解题思路

这道题的解法是动态规划,我们就拿下面这个字符串举例:
在这里插入图片描述

首先对于每个单个的字符来说,其肯定是回文串。那么假如我们构建的dp[i][j]来表示i~j范围内构成回文串所需要的步骤数。那么这个矩阵的对角线元素则均为0。
在这里插入图片描述

那么根据我们对dp的理解,我们知道i不会超过j的,所以对于左下角矩阵实际上是不用填充的,我们要填充的只有右上角的矩阵。

对于dp[i][j]来说,我们现在能够拿到dp[i+1][j-1]的值(其中dp[i+1][j-1]表示i+1j-1范围内元素是否是回文的),那么dp[i][j]就有以下几种情况:

  • 第一种就是s[i] == s[j],在这种情况下,dp[i][j] = dp[i+1][j-1]
    在这里插入图片描述
  • 第二种就是s[i] != s[j]
    在这里插入图片描述

这种情况下,我们我们可以在i的右边加上c使得s[i+1]~s[j]成为一个回文串。或者在j的左边加上z,使得s[i]~s[j-1]成为一个回文串,之后取这两个步骤最少的那一步。那么假设现在我们在i的右边加上c了,那么此时我们只需要在这个回文串的右边(也就是j的右边)加上z就可以构成回文了。
在这里插入图片描述

代码呈现

class Solution {
public:/*** @brief leetcode提供的函数* * @param s 待构成回文的字符串* @return int 构成回文的最少步骤*/int minInsertions(string s) {int s_size = s.size();vector<vector<int>> dp(s_size,vector<int>(s_size,0));for(int i =s_size-2;i>=0;i--){for(int j = i+1;j<s_size;j++){if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1];}else{dp[i][j] = min(dp[i+1][j],dp[i][j-1])+1;}}}return dp[0][s_size-1];}
};

参考文献

[1] labuladong的算法小抄[M].付东来

这篇关于LeetCode —— 1312. 让字符串成为回文串的最少插入次数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439767

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字