LeetCode 5.最长回文子串[区间DP]

XCP_Basic 移植步骤 阅读详情

题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring

 

中文题目,题意就不写了。

题解:

首先分析,如何能够判断是否能构成回文串,思考从每个独立的小子串开始往外扩展去构成一个大的子串,最后覆盖整个字符串。这让我想起用区间DP,只需要开两维的数组 dp[len][len]。第一维代表当前子串的左端,第二维代表当前子串的右端。

当然一个字符就能构成回文串了,所以初始化时dp[i][i]均为1 (i\in (0,len-1)),1代表这个子串是回文串。之后如果我从每一个子串中间开始扩展开来,当前枚举的区间在 [i,j] 当中的时候,若s[i] == s[j],并且dp[i+1][j-1] 的值为1,那么代表dp[i][j]也可以构成回文串,则让其dp[i][j] = 1,一次类推下去。在每段区间判断的时候,如果当前能够构成回文串的长度比原来的长,记录下当前的起点与终点即可。

复杂度达到了O(n^{^{2}}),因为没学Manacher了,我只能傻傻的用这样的复杂度去解决了。

[太久没写题了,TAT写个题都傻傻的花了好长时间,就当练手了]

虽然leetcode的题目都是只给了函数,我还是习惯性的自己写了全代码

#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int N=1e3+5;
int dp[N][N];
int main()
{
    string s;
    while (cin>>s)
    {
        int len = s.size();
        memset(dp,0,sizeof(dp));
        int mxl = 0, mxr = 0;
        for (int i=0 ; i<len ; ++i)
            dp[i][i]=1;
        for (int l=2 ; l<=len ; ++l)
        {
            for (int i=0 ; i+l<=len ; ++i)
            {
                int j = i+l-1;
                if (s[i] == s[j] && (j-1<i+1 || dp[i+1][j-1]))// j-1<i+1只是为了让长度为2的子串进行特判
                {
                    dp[i][j] = 1;
                    if (l > mxr-mxl+1)
                    {
                        mxl = i;
                        mxr = j;
                    }
                }
                else
                    dp[i][j] = 0;
            }
        }
        cout<<s.substr(mxl,mxr-mxl+1)<<endl;
    }
    return 0;
}

 

1、CUDA 编程基础 GPU计算的发展历程与重要性。首先回顾了计算机技术的发展,特别是摩尔定律的影响,强调了计算能力的快速提升。然而,随着晶体管尺寸的缩小和频率的停滞,单线程性能增长放缓。为了继续提升性能,多核处理器开始普及,促使软件开发者开始考虑并行计算。介绍了延迟导向设计和吞吐量导向设计的概念,CPU和GPU分别代表了这两种设计方法。GPU是吞吐量导向的,拥有众多弱小的ALU,通过流水线处理提高算术吞吐量。GPU的成功在于其高并行性和高吞吐量,以及能够分摊高昂的固定成本的大量销售额。 阅读详情

相关推荐

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

本文从初学者的角度分享的关于Matlab simscape 的基础内容,简单分享了Simscape搭建模型,创建子系统,修改定义参数等内容,为将来深入学习和使用simscape做铺垫。

万金油笑匠的博客 6522

区间DP——最长回文子序列/子串

最长回文子序列 状态转移 设d[i][j]d[i][j]d[i][j]表示以iii为起点以jjj为终点的区间内的最长回文子序列长度,显然此问题类似于 最大公共子序列,那么我们可以得到递推方程: 若s[i]==s[j]s[i]==s[j]s[i]==s[j],那么d[i][j]=d[i+1][j−1]+2d[i][j] = d[i+1][j-1]+2d[i][j]=d[i+1][j−1]+2 否则d[i][j]=max(d[i+1][j−1],d[i][j−1])d[i][j] = max(d[i+1][j

Happig的博客 490

HX720数据采集实战:从硬件连接到姿态解析(含避坑指南)

本文详细介绍了HX720高精度ADC芯片在数据采集与姿态解析项目中的实战应用。内容涵盖从硬件电路设计、驱动源码编写与优化,到原始数据处理、校准以及最终姿态角度计算的完整流程,并提供了关键的避坑指南和调试技巧,帮助开发者高效完成从传感器信号到可用姿态数据的转换。

i8j9k0l1的博客 488

题解:最长回文子串(4种解法)

题目:最长回文子串 难度:中等 一、描述 二、题解: 2.1 暴力法(O(N^3)) 解释: 循环三次。第一次起始点循环;第二次终止点循环(从最右边开始到起始点为止);第三次起始点开始终止点结束,当两个值不相等时候跳出循环。只有完整进行第三次循环才满足回文串的条件。 class Solution: def longestPalindrome(self, s: str) -> str: max_ = 1 max_str = s[0] length

v-space的博客 2万+

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

PostgreSQL+PostGIS空间数据入库实战:从矢量栅格到GeoServer发布全流程

本文详细介绍了将矢量与栅格空间数据导入PostgreSQL并利用PostGIS扩展进行管理的完整流程。内容涵盖环境搭建、使用shp2pgsql和raster2pgsql工具进行数据入库、基础空间查询验证,以及最终通过GeoServer发布为地图服务的实战步骤,为构建空间数据平台提供清晰指引。

weixin_29268267的博客 289

Leetcode刷题5

一、动态规划一、动态规划序列DP斐波那契数列是⼀个⾮常好的题⽬,既与递归有关,也与DP有关。可以从这个简单问题,思考递归与DP的内在关联。递归往往是从后往前计算DP往往是从前往后计算。

weixin_45699456的博客 238

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3372

LeetCode5最长回文子串(dp)

犹豫一直抗拒dp的题 于是拖了很久才写第五题 前两天终于学了一下dp还算入门 1.我们首先确定状态分解成子问题 dp[i][j]代表的意思是区间i-j是否回文 而i-j回文需要满足s[i]==s[j]并且dp[i+1][j-1]也是回文或者字符串长度小于4 格式为 a aa aba 一定也回文 2.写出状态转移方程 dp[i][j]=s[i]==s[j] AND (j-i+1<4 OR dp[i+1][j-1]) 3.初始化及边界问题 每一个字符自己都是回文的 置为true 防止数组下标越界 i+

qq_43434328的博客 147

DC-DC 转换器中的压电谐振器:当前状态和限制

在功率转换器应用中,居里温度较低的谐振器的 k 2和 Q M显着降低会导致效率降低,需要仔细的热处理。由于使用 PR 的功率转换器在不同的条件下运行,包括温度范围、电压偏置和功率电平,因此不可避免地会出现非线性效应,必须妥善解决这一问题,以免影响转换器的性能。等效电路模型(Butterworth Van-Dyke 或 BVD 模型)将压电谐振器在其机械谐振附近的电响应转换为一个简单电路,该电路由与由电极形成的输入电容 C 0并联的串联 RLC 动分支组成,见图图 1 还显示了阻抗与频率的关系。

2301_79716471的博客 1297

Android音频混音器AudioMixer实战:从多路输入到设备播放的完整流程解析

本文深入解析了Android平台上音频混音器AudioMixer的完整工作流程,涵盖从多路音频输入、轨道创建与配置、AudioBufferProvider数据源接入,到核心混音处理与最终设备播放的全过程。文章重点探讨了如何高效管理音频数据流、配置音量与重采样参数,并提供了缓冲区管理与性能优化的实战技巧,帮助开发者构建稳定、低延迟的音频应用。

l3m4n的博客 342

最长回文子序列---DP

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

qq_2725的博客 470

实战神器指标解析 篇四:主力吸筹指标及其分析和使用说明

主力可能会进行多次吸筹,因此需要根据黄色趋势线来判断是否有转强的变化。一旦出现转强的迹象,这通常意味着吸筹已经接近尾声,即将进入拉升前期。此时可以介入进行建仓。该股票指标通过分析价格变动的方式,能够精确跟踪并标识主力的吸筹行为。当底部出现多根洋红色柱子时,这通常表示出现了主力吸筹的指示。这段代码主要用于分析股票的底部吸筹情况、趋势和涨跌情况。

生活在别处 6224

LeetCode 5 最长回文子串 动态规划 区间DP

递推方程 `dp[i][j] = dp[i + 1][j - 1]`,表示如果子串 `buf = s[i , j + 1]` 首位相等,则只要去掉`buf`的首尾端点后的子串 `s[i + 1 , j]`是回文串,那么`buf`一定是回文串。

Curren的博客 494

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

区间DP解LeetCode 5 最长回文子串

5. 最长回文子串 给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 思路: 区间DP 如果一个问题能够先计算小区间,再从小区间枚举到大区间,就可以使用区间DP 在这道题中,我们可以使用一个二维数组,存储字符串区间是否是回文串 dp[i,j]代表s[i....j]是否是回文 那么状态转移就是:如...

与 248

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

leetcode 5. 最长回文子串(区间dp)

链接:https://leetcode-cn.com/problems/longest-palindromic-substring 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 区间dp的做法: 1、先设置好动态规划数组所表示的状态 dp[i][j]:表示区间 [i, j] 是否为回文子串, 0 代表区间不是回文子串,1 代表区间是回文子串 2、确定初始状态 首先将区间长度为1的都设为1,即dp[i][

默的博客 400

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣 5. 最长回文子串 C++

经典的区间dp问题。

这个人是一个c++修狗 267

leetcode 5. 最长回文子串 (区间dp)

题意: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2: 输入: “cbbd” 输出: “bb” 题解: dp[i][j](boolean)dp[i][j](boolean)dp[i][j](boolean):代表iii到jjj是否是回文串 首先预处理 长度为1,2的子串 dp[i][j]dp[i][j]dp[i][j] = (dp[i+1

我是蒋卫升呀~ 346

【区间DP】leetcode 5. 最长回文子串

【区间DP】leetcode 5. 最长回文子串

Kevin1163的博客 211

LeetCode 5 最长回文子串 and LeetCode 647. 回文子串(区间DP)

题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s = “cbbd” 输出:“bb” 示例 3: 输入:s = “a” 输出:“a” 示例 4: 输入:s = “ac” 输出:“a” 区间DP模板使用。 基本模本如下:首先枚举区间长度,之后枚举区间的起始位置。框架如下 其中区间终点计算过程:起点定义为 i ,终点定义为 j 。[i,j] 区间长度为len,因此j-i+1=len

yangyangcome的博客 181

区间动态规划——最长回文子串(C++)

难得心静。

m0_73962294的博客 1220

C++ 双指针 动态规划 力扣 5. 最长回文子串 每日一题 题解

本文用图解+实战代码深度拆解 LeetCode 5「最长回文子串」。先对比暴力/中心扩展/区间 DP 三种写法,给出可投产版 C++ 源码;再复盘长度计算、填表顺序、边界 case 四大易错点;最后补充面试反杀追问与 Manacher 优化路径,助你 10 分钟彻底吃透回文串,从容应对笔试与工程场景。

Q741_147的博客 1036

Leetcode.5 最长回文子串

区间DP

感觉画质不如...原神的博客 1256

[特殊字符] LeetCode 5. 最长回文子串(C语言 | 动态规划详解)

本文介绍了使用动态规划求解最长回文子串问题的方法。通过定义dp[i][j]表示子串s[i...j]是否为回文,根据s[i]==s[j]和子串长度条件进行状态转移。重点强调了正确的遍历顺序(从下往上)以避免计算错误,并提供了完整的C语言实现代码。文章还分析了常见错误、复杂度(时间O(n²),空间O(n²)),并对比了中心扩展和Manacher等优化方法,建议掌握动态规划作为基础解法后再学习更高效的算法。

2302_80441878的博客 124

LeetCode 5 -- 区间DP | 中心拓展算法

而马拉车算法能有效解决这两个问题,虽然它也是基于暴力匹配,但是它通过预处理做了优化,并且能避免偶数长度回文串的问题。,因此在中心拓展算法中,我们除了每次选取一个点作为中心外,还要选取两个相邻的点(前提是这两个点的值相同)作为中心处理回文串长度为偶数的情况。我们可以枚举字符串的每个点为中心,从这个点开始向两头拓展,如果拓展之后的两头边界仍然相同,说明是回文串,否则结束拓展。的时间复杂度级别是相同的,但是该算法的常数更小,每次拓展是拓展两个元素,而。另外,中心拓展算法无法直接解决字符串长度为偶数的情况,例如。

jyyyyx的算法之旅 1085

#Leetcode 5. 最长回文子串

中心扩散法,每个回文子串都有一个特点,从中间开始往左右两边扩散,值是一样的,暴力每一个数,然后往两边扩散,看看最大有多少个字符,然后记录下来取最值。2.判断第i个和第j个字符是否相等,如果相等就等于前一个的最大公共子串值+1。1.dp[i][j]含义:长度为i的原串和长度为j的反转串的最大公共子串。由于回文串反转之后不变,所以反转整个字符串,然后求着两个字符串的最大公共子串。给你一个字符串 s,找到 s 中最长的 回文 子串。输入:s = "babad"输入:s = "cbbd"

weixin_45871108的博客 242
上一篇: HDU5663 Hillan and the girl[莫比乌斯反演]
ControlBear
博客等级 码龄11年 34粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值