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

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一,最长回文串

1.题目

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。

示例 2:

输入:s = "cbbd"
输出:2
解释:一个可能的最长回文子序列为 "bb" 。

提示:

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

2.题目接口

class Solution {
public:int longestPalindromeSubseq(string s) {}
};

 3.解题思路及其代码

      在思考这道题时,我们先想到的可能是dp[i]来作状态转移方程,表示以第i个位置为结尾的最长回文子序列。但是,我们是不能这样定义的。因为第i个位置能不能加入到这个子序列中是要看当前子序列的开头位置的字符是否与之匹配的。

      在弄明白抛弃掉这种想法以后,我们便可以试着以区间dp的方式来解决:

1.状态表示:dp[i][j],表示在区间[i,j]的最长子序列。

2.状态转移方程:对于状态转移方程的推导需要分类讨论,分类如下:

在第二种情况下dp[i][j]要等于在这三种情况下的最大值,又因为dp[i+1][j-1]其实是在剩下的两种情况中包含的,所以dp[i][j] = max(dp[i+1][j],dp[i][j-1])。

代码

根据以上思路写出代码如下:

class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>>dp(n,vector<int>(n));for(int i = n-1;i>=0;i--)//因为有dp[i][j] = dp[i+1][j]的情况,所以要从下到上初始化{for(int j = i;j<n;j++)//j>=i{if(s[i] == s[j])//第一种情况{if(j>i) dp[i][j] = dp[i+1][j-1]+2;//j>i才能加2else dp[i][j] = 1;//i == j,个数为1}else//第二种情况{dp[i][j] = max(dp[i+1][j],dp[i][j-1]);//不用担心越界的情况,因为当j == 0时//i一定等于0,所以会在第一种情况中处理}}}return dp[0][n-1];}};

二,让字符串成为回文串的最小插入次数

1,题目

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

提示

困难

218

相关企业

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 500
  • s 中所有字符都是小写字母。

2.题目接口

class Solution {
public:int minInsertions(string s) {}
};

3.解题思路及其代码

对于这种回文串问题,因为有了上面的定义状态表示的经验所以还是使用一个二维的dp表解决问题。

1.状态表示:dp[i][j]表示在[i,j]这个区间内使这个区间内的字符串成为回文串的最小插入次数。

2.状态转移方程:在这里状态转移方程还是要分类讨论,还是要看s[i],s[j]是否相等:

在第二种情况下要取两者的较小值。

代码:

由以上思路写出代码如下:

class Solution {
public:int minInsertions(string s) {int n = s.size();vector<vector<int>>dp(n,vector<int>(n));for(int i = n-1;i>=0;i--)//有dp[i][j] = dp[i+1][j]+1的情况,所以要从下到上遍历{for(int j = i;j<n;j++){if(s[i] == s[j]){if(j>i) 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][n-1];}
};

相关文章:

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一&#xff0c;最长回文串 1.题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&…...

CSS新手入门笔记整理:CSS列表样式

列表项符号&#xff1a;list-style-type 在HTML中&#xff0c;对于有序列表和无序列表的列表项符号&#xff0c;都是使用type属性来定义的。 语法 list-style-type:取值; list-style-type属性是针对ol或者ul元素的&#xff0c;而不是li元素。 有序列表属性 属性值 说明 …...

12月07日,每日信息差

以下是2023年12月07日的11条信息差 第一、社交媒体公司X计划在日本成立应用开发团队 第二、造车进程加快&#xff0c;小米汽车在多地招聘零售门店主管&#xff0c;零售门店主管工作地点涉及武汉、重庆、长沙、郑州、佛山、东莞、厦门等城市 第三、我国西南地区首座百万千瓦级…...

spring mvc理解

spring mvc M&#xff1a;model 模型 V&#xff1a;view 视图 C&#xff1a;controller 控制器 S: service 服务处理 D: Dao 数据持久化 视图 我理解就是web页面&#xff0c;帮助用户调用后端接口。 前后端分离之后&#xff0c;view似乎就和后端没什么关系了。 模型 格式…...

HTML-标签之文字排版、图片、链接、音视频

1、标签语法 HTML超文本标记语言——HyperText Markup Language 超文本是链接标记也叫标签&#xff0c;带尖括号的文本 2、HTML基本骨架 HTML基本骨架是网页模板 html&#xff1a;整个网页head&#xff1a;网页头部&#xff0c;存放给浏览器看的代码&#xff0c;例如CSSbody…...

圣诞将至—C语言圣诞树代码来啦

文章目录 圣诞将至—C实现语言圣诞树源码 圣诞将至—C实现语言圣诞树 圣诞树 源码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <math.h> #include <stdlib.h> #include <windows.h> #include <time.h> #define PI 3.14159265…...

Git常用命令#merge分支合并

要查看所有分支&#xff0c;包括本地和远程仓库的分支&#xff0c;可以使用以下命令&#xff1a; 1.查看分支 1.1 查看本地分支 git branch这个命令会列出本地所有的分支&#xff0c;当前所在的分支会有 * 标记。 1.2 查看远程分支 git branch -r这个命令会列出远程仓库的分…...

Windows server 2019 域环境部署

环境准备 准备3台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操作系统版本Windows Server 2019 Datacenter 域服务器&#xff1a;adc&#xff0c;192.168.56.120服务器1&#xff1a;server1:&#xff0c;192.168.56.121服务器2&#xff1a;server2&…...

Cocos Creator加入图片没有被识别

原因&#xff0c;需要更换类型&#xff0c;选择下图中的类型...

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…...

C++学习寄录(九.多态)

1.多态基本概念 先来看这样的代码&#xff0c;我的本意是想要输出“小猫在说话”&#xff0c;但实际输出的却是“动物在说话”。这是因为地址早绑定&#xff0c;在代码编译阶段就已经确定了函数地址&#xff1b;如果想要实现既定目标&#xff0c;那么这个dospeak&#xff08;&…...

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后&#xff0c;Linux系统开发工具的使用…...

java-HashMap、TreeMap、LinkedHashMap、ArrayList、LinkedList使用笔记

背景 Map<String, Integer> unsortedMap new HashMap<>(); unsortedMap.put("One", 1); unsortedMap.put("Two", 2); unsortedMap.put("Three", 3); unsortedMap.put("Four", 4); 一、关于排序 TreeMap&#…...

Oracle中mybatis批量更新报错ORA-00933:SQL命令未正确结束

项目场景&#xff1a; 最近在开发项目的过程中遇见了这个问题&#xff1a;Oracle中批量更新的时候报错 ORA-00933&#xff1a;SQL命令未正确结束 问题描述 mybatis批量更新报错ORA-00933&#xff1a;SQL命令未正确结束 <foreach item"item" index"index&q…...

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …...

Linux系统编程:线程总结

线程的概念 基本概念 所谓线程&#xff0c;通俗的说就是一个正在运行的函数。 在Linux系统中&#xff0c;线程是程序运行的最小单位&#xff0c;也被视为进程内部的控制序列。同一进程下的多个线程共享进程的所有资源&#xff0c;包括进程环境变量、打开的文件描述符、信号量…...

activemq启动成功但web管理页面却无法访问

前提&#xff1a; 在linux启动activemq成功&#xff01;本地能ping通linux 处理方案&#xff1a; 确定防火墙是否关闭&#xff0c; 有两种处理方案&#xff1a;第一种-关闭防火墙&#xff1b;第二种-暴漏8161和61616两个端口 netstat -lnpt查看8161和61616端口 注意&#xf…...

【Flink on k8s】- 0 - Flink kubernetes operator 快速入门与实战

完整的课程,请点击链接。 目录 一、你将收获 二、适用人群 三、课程介绍...

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…...

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

java+webstock

maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...