首页 > 其他分享 >516. 最长回文子序列

516. 最长回文子序列

时间:2024-04-09 22:22:22浏览次数:29  
标签:子串 return int res dfs 序列 516 回文

题目链接:

本题考察区间 \(dp\)
设 \(f[i][j]\) 表示子串 \(i \sim j\) 中的最长回文子序列的长度。
思考状态转移方程。因为是判断回文的问题,考虑首尾元素是否相同。
若首尾元素相同,则考虑去掉首尾元素之后子串的最长回文子序列的长度 + 2(首、尾元素各一个)
反之若首尾元素不相同,则分别去掉首和尾,看子串的最长回文子序列长度的最大值。

实现一、递推

class Solution {
public:
    static const int N = 1010;
    int f[N][N];
    int longestPalindromeSubseq(string s) {
        int n = s.size();
        for (int i = n - 1; i >= 0; i--) {
            f[i][i] = 1;//长度为1的子串
            for (int j = i + 1; j < n; j++) {//长度不为1的子串
                if (s[i] == s[j]) f[i][j] = f[i + 1][j - 1] + 2;
                else f[i][j] = max(f[i + 1][j], f[i][j - 1]);
            }
        }
        return f[0][n - 1];
    }
};

实现二、记忆化搜索

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.size();
        int memo[n][n];
        memset(memo, -1, sizeof memo);//初始化为-1,表示没有计算过
        function<int(int, int)> dfs = [&] (int i, int j) -> int {
            if (i > j) return 0;//空串
            if (i == j) return 1;//只有一个字母
            int &res = memo[i][j];//引用,简化代码
            if (res != -1) return res;
            if (s[i] == s[j]) return res = dfs(i + 1, j - 1) + 2;
            return res = max(dfs(i, j - 1), dfs(i + 1, j));
        };
        return dfs(0, n - 1);
    }
};

标签:子串,return,int,res,dfs,序列,516,回文
From: https://www.cnblogs.com/pangyou3s/p/18125001

相关文章

  • 被3整除的子序列
    题目描述给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除答案对1e9+7取模输入描述输入一个字符串,由数字构成,长度小于等于50输出描述输出一个整数代码实现#include<iostream>#include<string>usingnamespacestd;//这里利用了两个性质//1.添加下......
  • 基于GA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览ga优化前:     ga优化后:    2.算法运行软件版本matlab2022a  3.算法理论概述      时间序列预测是许多领域中的核心问题,如金融市场分析、气候预测、交通流量预测等。近年来,深度学习在时间序列分析上取得了显著的成果,尤......
  • 记一次php反序列化漏洞中的POPchain和POC构造实战
    来自于橙子科技反序列化靶场源代码如下:<?php//flagisinflag.phphighlight_file(__FILE__);error_reporting(0);classModifier{private$var;publicfunctionappend($value){include($value);echo$flag;}publicfunction......
  • 最长公共子序列(线性dp)-java
    本文主要来描述两个字符串的最长公共子序列问题文章目录前言一、最长公共子序列二、算法思路1.dp[i][j]的四种情况2.dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的关系3.dp数组的状态转移方程 4.dp数组具体如下三、代码如下1.代码如下(示例):2.读入数据3.代码运行结......
  • LeetCode题练习与总结:排列序列--60
    一、题目描述给出集合 [1,2,3,...,n],其所有元素共有 n!种排列。按大小顺序列出所有排列情况,并一一标记,当 n=3时,所有排列如下:"123""132""213""231""312""321"给定 n和 k,返回第 k 个排列。示例1:输入:n=3,k=3输出:"213"示例2:输入:n=4,k=......
  • Rome反序列化链分析
    环境搭建<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><de......
  • C++程序分享--常见编程面试题:判断字符串是否为回文串
    关注我,持续分享逻辑思维&管理思维;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。【图解《程序员面试常见的十大算法......
  • R语言多元Copula GARCH 模型时间序列预测|附代码数据
    原文链接  http://tecdat.cn/?p=2623原文出处:拓端数据部落公众号 最近我们被要求撰写关于CopulaGARCH的研究报告,包括一些图形和统计输出。和宏观经济数据不同,金融市场上多为高频数据,比如股票收益率序列。直观的来说,后者是比前者“波动”更多且随机波动的序列,在一元或多元......
  • CF156D-Prufer序列、多项式定理
    link:https://codeforces.com/contest/156/problem/D题意:给一张无向简单图\(G\),问有多少种加边的方式,使得图联通,并且需要加的边最小。\(|E|,|V|\leq10^5\),对\(k\)取模前置知识应该是Prufer序列(这题应该是绕不开这个东西)对每个连通分支考虑答案,如果有\(k\)个连通分支,大小......
  • .net xml序列化与xml反序列化
    序列化stringxmlStr="";vardto=newReqDto(){ErrorCode=200,ReqName="test"};XmlSerializerserializer=newXmlSerializer(typeof(ReqDto));using(StringWritertextWriter=newStringWriter()){serializer.Serialize(textWr......