LeetCode 516. 最长回文子序列

Java实现 LeetCode 516 最长回文子序列 516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子序列为 “bbbb”。 示例 2: 输入: “cbbd” 输出: 2 一个可能的最长回文子序列为 “bb”。 PS: 动态规划, 第一个就不多说了,dp【i】【j】就是截取后i位,然后挨着截取后i位的第j位 相等就+2,不相等找... 阅读详情

描述

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

示例 1:
输入:
“bbbab”
输出:
4
一个可能的最长回文子序列为 “bbbb”。

示例 2:
输入:
“cbbd”
输出:
2
一个可能的最长回文子序列为 “bb”。

提示:
1 <= s.length <= 1000
s 只包含小写英文字母

思路

还是用动态规划,枚举所有情况。dp[i][j]定义为字符串s的第i个字符到第j个字符之间最长的回文子序列长度。(哎…这个也不是很好想到啊)

初始值:当i>j时,没有意义,所以全部置为0;当i=j时,即每个字符的最长回文子序列就是自己,置为1。
在这里插入图片描述

要求dp[i][j],如果知道了dp[i + 1][ j - 1]的值,那么判断一下s[i]和s[j]的字符是否相等,如果相等,那么从i到j的最长回文子序列长度就是在dp[i + 1][j - 1]的基础上+2;若两者不想等呢?那么最少有一个不属于[i , j]区间中的最长回文子序列中,把s[i]和s[j]放入,哪个字符放入后回文子序列长度更长就取哪个值,即dp[i][j] = max{dp[i][j - 1], dp[i + 1][j])},至此,状态转移方程就得到了。

下面用图表示一下dp数组:
在这里插入图片描述
由图可以看出,未知的红色格子的dp值只与它左边、下边、斜左下方的格子有关。即dp[i][j]只与dp[i - 1][j]和dp[i][j - 1]、dp[i + 1][j]有关。所以可以按照下图的顺序斜着进行遍历:
在这里插入图片描述

或者可以从右下角开始,从左至右遍历:

在这里插入图片描述

解答

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int size = s.size();
        //dp[][]表示从第i个到第j个字符间最大的回文子序列长度
        vector<vector<int> > dp(size, vector<int>(size, 0));
        //初始化
        for(int i = 0;i < size; ++i)
            dp[i][i] = 1;
            
        int i = 0, j = 1, k = 1;
        for(;j < size;){
            if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2;
            else dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]); 
            i ++;            
            j ++;
            if(j == size){
                i = 0;k ++;j = k;
            }
        }
        return dp[0][size-1];
    }
};
Java实现 LeetCode 730 统计不同回文子字符串(动态规划) 730. 统计不同回文子字符串 给定一个字符串 S,找出 S 中不同的非空回文子序列个数,并返回该数字与 10^9 + 7 的模。 通过从 S 中删除 0 个或多个字符来获得子字符序列。 如果一个字符序列与它反转后的字符序列一致,那么它是回文字符序列。 如果对于某个 i,A_i != B_i,那么 A_1, A_2, … 和 B_1, B_2, … 这两个字符序列是不同的。 示例 1: 输入: S = ‘bccb’ 输出:6 解释: 6 个不同的非空回文子字符序列分别为:‘b’, ‘c’, ‘bb’, ‘cc’, ‘bcb’, ‘bccb’。 注意:‘bcb’ 虽然出现两次但仅计数一次。 示 立即下载

相关推荐

STM32 WinUSB免驱实现:从DFU模式到高速通信的实战指南

本文详细介绍了STM32 WinUSB免驱实现方案,从DFU模式到高速通信的完整实战指南。通过修改设备描述符、添加BOS描述符和实现WCID描述符集,开发者可以轻松实现即插即用的USB设备,无需额外安装驱动。文章还提供了性能优化技巧和实际应用案例,帮助开发者快速部署高效稳定的USB通信方案。

weixin_29171087的博客 422

回文子序列和回文子串问题

目录一、【LeetCode 516】最长回文子序列1. 问题描述2. 解题思路3. 代码二、【LeetCode 647】回文子串1. 题目描述2. 第一种方法——动态规划3. 第二种方法——中心扩展法三、【LeetCode 5】最长回文子串1. 题目描述2. 第一种方法——动态规划3. 第二种方法——中心扩展法 一、【LeetCode 516】最长回文子序列 1. 问题描述 给定一个字符串s,找到...

oyall520的博客 1792

AD936x Evaluation Software 详细配置

作者:ShownSun 工作室:时沿科技 文章目录AD936x Evaluation Software详细配置1 系统概述2 AD9361 Wireless Transceiver Evaluation Setup2.1 标签描述2.2 用户参数2.3详细配置3 AD936x RF Wizard3.1 标签描述3.2 用户参数3.3 详细配置4 AD936x Digital Filter Wizard4.1 标签描述4.1.1 时钟配置4.1.2 滤波器配置4.1.3 接收滤波器配置4.1.4 发射滤..

ShownSun博客 5193

字符串中子序列是回文———C++

奇数的回文子序列 输入:aba 输出:a b aba #include<iostream> #include<vector> #include<set> using namespace std; int huiwen(string s1){ int l=0,r=s1.size()-1; int flag=1; while(l<s1.size() && r>0){ if(s1[l]==s1[r]){ l++;r--; }

Dream19961996的博客 263

台式机ubuntu系统屏幕无法调节的问题(已解决)(汇总)

背景:新配了一台主机,安装了双系统,windows下屏幕在带鱼屏上显示良好,但Ubuntu系统屏幕拉伸严重。 问题描述:系统没有适应屏幕被整个拉伸了,进入设置界面,显示Built-in Display,分辨率只有1024*768无法设置。 尝试一:网上最多的方法就是使用xrandr, 结果显示:xrandr:Failed to get size of gamma for output default 尝试二: 第一次进入命令行页面:login:填你的用户面 password:使用字母上方的数字键输入你的密码

weixin_45626706的博客 4624

MounRiver Studio实战:像管理个人项目一样整理沁恒MCU的EVT例程(附文件结构图)

本文详细介绍了如何使用MounRiver Studio重构沁恒MCU的EVT例程,实现工程化管理。通过分析官方EVT设计的局限性,提出标准化的目录结构和迁移步骤,帮助开发者提升代码可维护性和团队协作效率。文章还提供了MounRiver Studio的关键配置参数和常见问题排查指南,适用于沁恒MCU开发者。

weixin_33940469的博客 356

最长回文子序列和最长回文子序列

最长回文子序列 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子序列为 “bbbb”。 解法:(参考) 与最长回文子串类似,都是从对角线往右上角更新。但是子序列可以不连续,所以递推公式是: 当子序列的首位相等时->dp[i][j] = dp[i+1][j-1] + 2; 当子序列的首位不同时->dp[i][j] = max(dp[i][j-1],dp[i+1]

li123_123_的博客 462

最长回文子串和最长回文子序列-返回相应字符串

一、题目 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如 “a”、“aba”、“abba”。 对于一个字符串,其子串是指连续的一段子字符串,而子序列是可以非连续的一段子字符串。 最长回文子串 和 最长回文子序列(Longest Palindromic Subsequence)是指任意一个字符串,它说包含的长度最长的回文子串和回文子序列。 例如:字符串 “ABCDDCEFA”,它的 最长回文子串 即 “CDDC”,最长回文子序列 即 “ACDDCA”。 二、最长回文子串 思路 首先

weixin_44879249的博客 353

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1632

芒果YOLO11改进146:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 641

最长回文子序列

最长回文子序列 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 - 1 <= s.length <= 1000 - s 仅由小写英文字母组成

看流云落成雨滴 372

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

力扣LeetCode: 516 最长回文子序列

动态规划觉得题目。从后往前。

weixin_73982851的博客 761

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Leetcode516 最长回文子序列

Leetcode516: Longest Palindromic Subsequence 具体题目如下: Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000. Example 1: Input: “b...

Flying_sfeng的博客 660

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

力扣516-最长回文子序列(Java详细题解)

我的算法篇最后一曲,超级细致的讲解,保证看完就会。

2302_79761426的博客 1561

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LeetCode 516.最长回文子序列

LeetCode 516.最长回文子序列 区间型动态规划 确定状态: 最优策略产生的最长回文子串是T,长度M。 情况一:回文串长度为1,即一个字母。 情况二:回文串长度大于1,那么必定有T[0]=T[M-1] 设T[0]是S[i],T[M-1]是S[j],剩下的T[1...M-2]仍然是回文串,而且是S[i+1...j-1]的最长回文子串。 状态: 设f[i][j]为S[i..j]的最长回文子串的...

未命名 250

最长回文子序列--LeetCode516

最长回文子序列–LeetCode516 题目 给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入:"bbbab" 输出:4 解释:一个可能的最长回文子序列为 "bbbb"。 示例 2: 输入:"cbbd" 输出:2 解释:一个可能的最长回文子序列为 "bb"。 思路 状态定义 dp[i][j]表示 s 的第i个字符到第j个字符组成的子串中,最长的回文...

何时立秋的博客--向前有路,未来可期 287

Leetcode 516. 最长回文子序列 C++

Leetcode 516. 最长回文子序列 题目 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 测试样例 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bbbb"。 示例 2: 输入: "cbbd" 输出: 2 一个可能的最长回文子序列为 "bb"。 提示: 1 <= s.length <= 1000 s 只包含小写英文字母 题解 动态规划 令dp[i][j]表示s[i~i]最长回文子序列

weixin_43750513的博客 889

leetcode 516:最长回文子序列

leetcode 516. 最长回文子序列 题目描述:给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 解题步骤:解决此类问题可以采用动态规划dp[i][j]表示从第i个字符到第j个字符之间的最长回文子串。该问题类似于01背包问题 1、 状态定义:dp[i][j] 表示从第i个字符到第j个字符之间的最长回文子串的长度 2、 状态转移方程: 如果第i个字符和第j个字符相同...

张毅的博客 836

LeetCode. 516最长回文子序列

将dfs(i,j)定义为从iii到jjj的最长回文子序列的长度。

akeyy的博客 899

Leetcode.516 最长回文子序列

区间DP

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

LeetCode 516.最长回文子序列 C++

LeetCode 516.最长回文子序列 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子序列为 “bbbb”。 示例 2: 输入: “cbbd” 输出: 2 一个可能的最长回文子序列为 “bb”。 提示: 1 <= s.length <= 1000 s 只包含小写英文字母 来源:力扣(LeetCode) 链接:https://leetcode-

wzy1414的博客 728

【leetcode】516.最长回文子序列

【leetcode】516.最长回文子序列题目思路代码复杂度 做这道题之前可以先看一下这一道【leetcode】647.回文子串 题目 leetcode原题链接 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s = “bbbab” 输出:4 解释:一个可能的最长回文子序列为 “bbbb” 。 示例 2: 输入:s = “cbbd” 输出:2 解释:一个可能的最长回文

laplacepoisson的博客 398

LeetCode第 516 题:最长回文子序列(C++)

516. 最长回文子序列 - 力扣(LeetCode) 不像第五题:LeetCode第 5 题:最长回文子串(C++)_zj-优快云博客 这儿的回文子序列是不需要连续的。这题其实是dp的思路去做,不过这一题的dp有点特殊 参考这儿的图;子序列问题通用思路|最长回文子序列 - 最长回文子序列 - 力扣(LeetCode) if (s[i] == s[j]) // 它俩一定在最长回文子序列中 dp[i][j] = dp[i + 1][j - 1] + 2; else // s[

zj 675

LeetCode-516:最长回文子序列

LeetCode-516:最长回文子序列 给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bbbb"。 示例 2: 输入:"cbbd" 输出: 2 一个可能的最长回文子序列为 "bb"。 思路:...

lizhao8817的博客 470
上一篇: LeetCode 1143. 最长公共子序列
下一篇: LeetCode 72. 编辑距离
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值