最长回文子序列_符合回文序列长度的最长子序列_Jack Ju的博客-程序员秘密

技术标签: 算法  leetcode  动态规划  Leetcode  

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

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

示例 1:

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

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

解答:
此题使用动态规划思想,首先写出状态转移函数:
我们使用dp[i][j]表示字符串i到j是否是回文子串的长度。
状态转移函数如下:
dp[i][j] = dp[i+1][j-1]+2(s[i] =s[j])
dp[i][j]= max(dp[i+1][j],dp[i][j-1]) ([i] !=s[j])
dp[i][i]=1
需要考虑遍历的顺序,画图看。
如下:

class Solution {
    
public:
    int longestPalindromeSubseq(string s) {
    
        if(s.size()<2){
    
            return 1;
        }
        int dp[1000][1000]={
    0};//dp[i][j]表示字符串[i到j]最大回文序列长度
        for(int i=0;i<s.size();i++){
    
            dp[i][i]=1;
        }
        //思考为什么for循环要如此遍历。
        for(int i=s.size()-1;i>=0;i--){
    
            for(int j=i+1;j<s.size();j++){
    
                if(s[i!=s[j]]){
    
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
                if(s[i]==s[j]){
    
                    if(j-i<=2){
    
                        dp[i][j]=j-i+1;
                    } else {
    
                        dp[i][j]=2+dp[i+1][j-1];
                    }
                }
            }
        }
        
        return dp[0][s.size()-1];
    }
};

总结:
(1)写出状态转移函数并且明确边界。
(2)思考两个for循环该怎么遍历,i,j谁在前,从大到小还是从小到大遍历,都是可思考的事情。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40464599/article/details/125238656

智能推荐

Eigen 中旋转矩阵、旋转向量、欧拉角、四元数的使用_eigen 旋转矢量_gwh1010的博客-程序员秘密

用到 Eigen/Core 和 Eigen/Geometry 模块定义一个3×33 \times 33×3 矩阵并使用单位阵对其初始化:矩阵名称 = Eigen::Matrix3d::Identity()定义一个旋转向量:Eigen::AngleAxised 矩阵名称(旋转角*(弧度),旋转轴(3×13\times13×1)*)输出精度设定:cout.precision(val) (小数点后...

Windows 搭建 FTP 服务器-程序员秘密

Windows 搭建 FTP 服务器

字符串概念和常用API_字符串的api_小吖小月亮的博客-程序员秘密

1.字符串的定义方式有以下4种,一般用指针最为合适。#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int main(){ int i; char str[5]={'a','b','c','d','e'}; //第一种 for(i=0;i&lt;sizeof(str)/sizeof(str[0]);i++){ printf("%c",str[i]); } putchar('\n'); printf("===========

FPGA 超级实用的约束技巧,当时序遇到怎么编译都不可行的时候可以考虑用下面的方法_Best_Leei的博客-程序员秘密

Floorplanning在vivado中,可以将某一个模块的代码固定在某一个范围内,可以使用Floorplanning功能。首先完成一次编译后,选择open Implemented Design功能,选择目标模块,再选择Draw Pblock功能,可以在右侧画出你想要将其布局的地方。完成后选择保存。注意所选择的范围区域的资源足够模块代码使用。Fix cells当FPGA时序约束比较困难时,某个模块的代码容易出现问题,我们可以首先针对易出现问题的模块编译出一个简易无时序...

QComboBox下拉框文字如何在字体变大之后自适应高度_qcombox设置字体大小_前行中的小猪的博客-程序员秘密

一、简述一般我们给QComboBox设置完字体之后,在显示上并没有什么问题如下图。a、正常状态由于程序在最大化的时候,因为主窗口尺寸变大,需要整体改变所有控件的尺寸,文字的大小,所以在窗口最大化时因为文字变大,所以会出现这样的效果。我们发现下拉列表没有铺满,虽然下拉框的的高度变了。b、字体放大时,文字错位所以在ComboBox创建完成,第一次展开下拉框时,下拉框文字显示是正常的,无...

js基础系列 -深入理解 js中的函数_zz_jesse的博客-程序员秘密

关注“重度前端”代码之外更应该学会独立思考助力前端深度学习━━━━译文链接:http://www.codeceo.com/article/javascript-fun...

随便推点

UE4.27 VScode 找不到源文件修复方法_ue4无法打开源文件_Eritque arcus的博客-程序员秘密

来源:stackOverFlow解决方法把 .vscode 下 compileCommands_***.json 里的C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\bin\\HostX64\\x64\\cl.exe替换成\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\

FTP 服务器_ftp服务器_不会就跑路的小白的博客-程序员秘密

FTP 简介FTP(File Transfer Protocol,文件传输协议)是用于在网络上进行文件传输的一套标准协议,它属于网络传输协议的应用层。它最主要的功能是在服务器与客户端之间进行文件的传输。这个协议使用的是明文传输。为了更安全的使用FTP协议,只介绍较为安全但功能较少的vsftpd这个软件。FTP服务器的功能除了单纯的进行文件的传输与管理外,依据服务器软件的配置架构,它还可以提供以下几个主要功能:1、不同的用户:FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是:

【LeetCode】76. 最小覆盖子串 结题报告 (C++)_暮雨凉初透的博客-程序员秘密

原题地址:https://leetcode-cn.com/problems/minimum-window-substring/description/题目描述:给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。示例:输入: S = &quot;ADOBECODEBANC&quot;, T = &quot;ABC&quot;输出: &quot;BANC&quot;说明:如果 S 中不存这样的子串,...

Golang——Go语言发展史(一)_golang版本历史_Mr.Qubb的博客-程序员秘密

一、前言个人认为:作为一名语言爱好者,需要了解到一门语言的发展史(当然这个在面试的时候属于拓展话题,会让面试官眼前一亮)。如果单纯停留在使用者的角度,二、

elasticsearch2.3.2服务搭建、管理及实时同步mysql数据_dewffgqd的博客-程序员秘密

elasticsearch是基于Luence的一个全文检索框架,高效,快速,准确。本文参考一下几篇博客:http://blog.csdn.net/cnweike/article/details/33736429http://www.cnblogs.com/zhongshengzhen/p/elasticsearch_logstash.htmlhttp://blog.

推荐文章

热门文章

相关标签