【动态规划】最长回文子串

news/2024/9/29 1:28:38/

最长回文子串(难度:中等)

在这里插入图片描述
该题对应力扣网址

思路

题目分成三种情况

情况一:每一个字符都是长度为1的回文串
情况二:长度大于2的回文串:看从i到j的字符串包含的从i+1到j-1的字符串是否是回文串动态规划思想),如果是,再比较s[i]和s[j]
情况三:长度为2的回文串

动态规划的场景变化

从上一篇博客开始,动态规划已经从显式的矩阵路径图可以直观的看到dp[i][j]中的i是横坐标,j是纵坐标这种
变成了字符串这种一维的向量
这时候,dp[i][j]中的i和j是指从下标i到下标j截取的字符串,隐含条件式i<=j

注意点

在遍历的时候,因为关键是看dp[i+1][j-1]
所以一定要保证在算dp[i][j]的时候,它的dp[i+1][j-1]其实是已经计算过的
那么也就是说,这个遍历的顺序是从下往上,从左往右

AC代码

class Solution {
public:string longestPalindrome(string s) {int m=s.length();//dp[i][j]表示从下标i到j的回文子串的最大长度vector <vector<int>> dp (m,vector<int>(m));//默认所有单个字符都是一个回文子串// memset(dp, 1, sizeof(dp));for (int i = 0; i < m; ++i) {for (int j = 0; j < m; ++j) {//情况一:每一个字符都是长度为1的回文串dp[i][j]=1;}}int max_len=1;int i1=0,j1=0;//从下往上for(int i=s.size()-1;i>=0;i--){//从左往右for(int j=i;j<s.size();j++){//当前一个字符串是回文子串时,判断当前的两边字符是否相等if(j>=1){//情况二:长度大于2的回文串if((i+1)<=(j-1)){if(dp[i+1][j-1]==(j-i-1)){if(s[i]==s[j]){dp[i][j]=j-i+1;}}}//情况三:长度为2的回文串if(j-i+1==2){if(s[i]==s[j]){dp[i][j]=j-i+1;}}if(dp[i][j]>max_len){max_len=dp[i][j];i1=i;j1=j;}}// cout<<i<<" "<<j<<" "<<i1<<" "<<max_len<<endl;}}return s.substr(i1, max_len);}
};

补充:新的代码用法

s.substr(i,len)
i是字符串的起始下标
len是截取的字符串的长度


http://www.ppmy.cn/news/1531201.html

相关文章

TypeScript 设计模式之【装饰模式】

文章目录 **装饰模式**&#xff1a;为你的对象穿上华丽的外衣装饰者的魔法装饰模式有什么利与害&#xff1f;如何使用装饰者来美化你的对象代码实现案例装饰模式的主要优点装饰模式的主要缺点装饰模式的适用场景总结 装饰模式&#xff1a;为你的对象穿上华丽的外衣 嘿程序员&a…

Linux网络——HTTPS详解

文章目录 HTTPS加密 常见加密方式对称加密非对称加密非对称对称数据指纹 证书CA认证数字签名非对称证书对称 中间人 HTTPS 这也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 为什么要加密呢&#xff0c;这主要是因为如果不对传输主体加密&#xff0c;当…

webstorm新建一个新vue项目用命令解决

在WebStorm中直接通过命令新建一个Vue项目&#xff0c;通常意味着你需要先确保你的电脑上安装了Node.js和npm&#xff08;或yarn&#xff09;&#xff0c;然后全局安装Vue CLI。Vue CLI是一个基于Vue.js进行快速开发的完整系统&#xff0c;提供了从零开始搭建Vue项目所需的所有…

Linux驱动开发(速记版)--并发与竞争

第十八章 并发与竞争 18.1 并发与竞争 18.1.1 并发 早期计算机 CPU单核心时&#xff0c;由于 CPU执行速度快于I/O操作&#xff0c;常因等待 I/O而空闲。 为提高 CPU利用率&#xff0c;引入了并发执行理论。并发通过算法在CPU执行I/O等待时切换至其他任务&#xff0c;使多个任…

Mybatis映射文件详解-mapper.xml文件

在Mybatis中&#xff0c;Mapper XML文件是用于定义SQL语句和Java方法之间映射关系的核心配置文件。通过这些文件&#xff0c;开发者可以将数据库中的表与Java对象进行映射&#xff0c;实现数据的持久化操作。本文将详细介绍Mybatis映射文件的相关知识&#xff0c;包括其结构、标…

js 如何监听 body 内容是否改变

如果您想监听body内容的变化&#xff0c;并作出响应&#xff0c;可以使用MutationObserver。以下是一个简单的例子&#xff0c;它会在body内容变化时在控制台输出一条消息&#xff1a; // 创建一个观察者对象 const observer new MutationObserver(function(mutations, obser…

001、restful设计规范

https://www.kancloud.cn/kancloud/rest-api-design-safety/78113 https://www.kancloud.cn/kancloud/http-api-design/78123 https://www.kancloud.cn/kancloud/http-api-guide/56268 restful接口设计规范 按照restful接口设计规范 GET &#xff08;SELECT&#xff09;&…

flutter 设置字体大小,适应各种屏幕

起因&#xff0c; 目的: 来源就是客户需求。 从个人角度来说&#xff0c;我讨厌 flutter, 和 java 一样&#xff0c; 都是 臃肿&#xff0c;繁琐&#xff0c;死板. 1. 过程: 根据用户的屏幕尺寸&#xff0c;把子元素大小&#xff0c; 字体的大小&#xff0c;都设置为百分比&…