动态规划-最长的回文序列

news2025/2/13 5:31:51

这里写自定义目录标题

  • 1 描述
  • 2 样例
    • 2.1 样例1
    • 2.2 样例2
  • 3 解题思路以及实现方法
    • 3.1 解题思路
      • 3.1.1 确定状态
      • 3.1.2 转移方程
      • 3.1.3 初始条件和边界情况
      • 3.1.4 计算顺序
    • 3.2 题解
      • 3.2.1 C++实现
      • 3.2.2 java实现

该题是lintcode上 667 · 最长的回文序列,该题的解题思路亦是参考了九章侯老师的解题思路给出。

1 描述

给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.

2 样例

2.1 样例1

输入: “bbbab”
输出: 4
解释:
一个可能的最长回文序列为 “bbbb”

2.2 样例2

输入: “bbbbb”
输出: 5

3 解题思路以及实现方法

3.1 解题思路

3.1.1 确定状态

最优策略产生最长的回文子串T,其长度为M;

  • 情况1:回文串长度为1,既只包含一个字母
  • 情况2:回文串长度大于1,则T[0] == T[M - 1]
    对于情况2,剩余部分T[1…M - 2]仍然是一个回文串

子问题:
要求s[i…j]的最长回文子串
如果s[i] == s[j],需要知道s[i + 1, j + 1]的最长回文子串,否则,答案是s[i + 1 … j]的最长回文子串或s[i, …, j - 1]的最长回文子串
状态:设f[i][j]表示为s[i … j]的最长回文子串的长度

3.1.2 转移方程

在这里插入图片描述

3.1.3 初始条件和边界情况

状态:设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}

初始条件:

  • f[0][0] = f[1][1] = … = f[N-1][N-1] = 1
    • 一个字母,既长度为1的回文串
  • 如果s[i] == s[i + 1],f[i][i + 1] = 2
  • 如果s[i] != s[i + 1],f[i][i + 1] = 1

3.1.4 计算顺序

设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}
区间动态规划:按照长度j - i 从小到大一次去计算。

3.2 题解

3.2.1 C++实现

class Solution {
public:
    /**
     * @param s: the maximum length of s is 1000
     * @return: the longest palindromic subsequence's length
     */
    int longestPalindromeSubseq(string &s) {
        // write your code here
        int n = s.size();

        if (n <= 1) {
            return n;
        }

        vector<vector<int>> f(n, vector<int>(n, 1));

        for (int i = 0; i < n - 1; i++) {
            f[i][i + 1] = (s[i] == s[i + 1]) ? 2 : 1;
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                f[i][j] = max(f[i + 1][j], f[i][j - 1]);
                if (s[i] == s[j]) {
                    f[i][j] = max(f[i][j], f[i + 1][j - 1] + 2);
                }
            }
        }

        return f[0][n - 1];
    }
};

3.2.2 java实现

public class Solution {
    /**
     * @param s: the maximum length of s is 1000
     * @return: the longest palindromic subsequence's length
     */
    public int longestPalindromeSubseq(String s) {
        // write your code here
        char[] str = s.toCharArray();
        int n = str.length;
        if (n <= 1) {
            return n;
        }

        int[][] f = new int[n][n];

        for (int i = 0; i < n; i++) {
            f[i][i] = 1;
        }

        for (int i = 0; i < n - 1; i++) {
            f[i][i + 1] = (str[i] == str[i + 1]) ? 2 : 1;
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                f[i][j] = Math.max(f[i + 1][j], f[i][j - 1]);
                if (str[i] == str[j]) {
                    f[i][j] = Math.max(f[i][j], f[i + 1][j - 1] + 2);
                }
            }
        }

        return f[0][n - 1];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

方法选对,事半功倍:数据分析方法

人们发明了数据可视化&#xff0c;利用人类大脑更善于处理图像信息的特点&#xff0c;透过图形化的手段&#xff0c;用图表清晰有效地传达和沟通信息。把以往庞杂、繁乱的数据报表转化成简洁明了的可视化图表。 通过数据可视化制作出的图表&#xff0c;不再像传统分析方案那样…

JavaScript Web APIs学习总结

以后声明变量我们有限使用哪一个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#xff0c;只要地址不变&…

月入6000+的CSGO游戏搬砖项目操作细节和要求

月入6000的CSGO游戏搬砖项目操作细节和要求 最近咨询CSGO搬砖项目的人较多&#xff0c;在此整理一份统一的项目操作细节和要求。 1、什么是国外Steam游戏装备汇率差项目&#xff1f; 这个项目的基本原理是&#xff1a;购买国外Steam游戏平台上的装备&#xff0c;再在国内网易…

SSR渲染--02--nuxt demo(vue)

cmd 打开命令提示符&#xff0c;创建nuxt npm i create-nuxt-app -g create-nuxt-app vue-honor-of-kings&#xff08;这个是我的项目名&#xff0c;输入自己的项目名&#xff09; npm run dev创建的具体配置 【写demo为了方便&#xff0c;我直接下载了Element的包&#xff0…

游戏画面延迟的原因及解决方法

游戏画面延迟&#xff0c;是玩家在游戏中操作后&#xff0c;画面反应出现滞后或卡顿的现象。这会严重影响玩家的游戏体验和竞技水平&#xff0c;尤其是在一些需要高速反应和精确操作的3A大作中&#xff0c;画面延迟可能导致玩家错失良机或者被敌人击败。 那么&#xff0c;游戏…

电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP(2)

原文&#xff1a;《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP&#xff08;2&#xff09;-阿里云开发者社区 简介&#xff1a; 《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP&#xff08;2&#xff09; 《CDP企业数据云平台从入门到实践》——如…

Windows安装和配置VCenter

Vcenter的环境搭建和配置 Vcenter简介 Vcenter一般指 VMware vCenter™ Server&#xff0c;VMware vCenterServer 提供了一个可伸缩、可扩展的平台&#xff0c;为 虚拟化管理奠定了基础。 VMware vCenter Server&#xff08;以前称为 VMware VirtualCenter&#xff09;&#…

Qt6.5.1+WebRTC学习笔记(十一)开发环境搭建(ubuntu22.04)

前言 win10开发测试已经一段时间了&#xff0c;最近将程序移植到ubuntu测试了下&#xff0c;改动不是很大&#xff0c;本教程记录下环境搭建过程 一、准备 1.操作系统ubuntu22.04 64位 x86架构&#xff08;建议更新到最新&#xff09; 2.合理的上网方式&#xff0c;需要正常…

模板匹配笔记

模板匹配是一种最基本、最原始的模式识别的方法。通过对比某一特定物体的图案位于图像的什么地方&#xff0c;进而识别出物体。它是图像处理中最基本、最常用的匹配方法。它的局限性主要是它只能进行平行移动&#xff0c;若原图像中的匹配目标发生旋转或大小变化&#xff0c;该…

运维(SRE)成长之路-第2天 文本编辑工具之神VIM

vi和vim简介 在Linux中我们经常编辑修改文本文件&#xff0c;即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano&#xff0c;实际工作中我们会使用更为专业&#xff0c;功能强大的工具 文本编辑种类&#xff1a; 全屏编辑器&#xff1a;nano&#xff08;字符工具…

Spark SQL数据源:Parquet文件

文章目录 一、Parquet简介二、读取和写入Parquet的方法&#xff08;一&#xff09;利用parquet()方法读取parquet文件1、数据准备2、读取parquet文件3、显示数据帧内容 &#xff08;二&#xff09;利用parquet()方法写入parquet文件1、写入parquet文件2、查看生成的parquet文件…

Spring Security--多个过滤器链和多个用户表

请求从客户端出发&#xff0c;到达客户端&#xff0c;也就是servlet&#xff0c;中间有很多过滤器的&#xff0c;其中就有一个过滤器链代理&#xff0c;里面包含了过滤器的一个集合。而且Spring Security Filter并不是直接嵌入到Web Filter中的&#xff0c;而是通过FilterChain…

海纳“千川”:得物多场景统一推荐平台|精选

1 千川由来 得物的推荐场景&#xff0c;除了首页瀑布流等几个比较大的场景之外&#xff0c;还有很多长尾的小场景&#xff0c;包括&#xff1a;频道、会场、购中购后场景、品牌墙等。这类场景存在单个场景体量小&#xff08;UV和GMV均偏小&#xff09;、场景零散、类型多元的情…

炫龙笔记本怎么用U盘重装Win10系统?

炫龙笔记本怎么用U盘重装Win10系统&#xff1f;很多使用炫龙笔记本电脑的用户在问&#xff0c;怎么使用U盘来重装一下电脑的Win10系统&#xff0c;这时候用户先要准备一个U盘&#xff0c;还有一个能够正常联网的炫龙笔记本电脑&#xff0c;最后按照以下炫龙笔记本用U盘重装Win1…

可算是熬出头了,测试3年,费时6个月,入职阿里,涨薪14K

本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半后开始沪漂生活&#xff0c;又摸爬滚打了一年半&#…

FL Studio21.0.3最新版本下载 可切换中文语言

FL Studio是最好的! 在我12/13岁的时候&#xff0c;一个DJ向我介绍了FL Studio。它让我大吃一惊&#xff0c;怎么能在几秒钟内做出一个鼓的模式。后来我又玩了好几年&#xff0c;到了15岁时&#xff0c;我确定我想成为一名制作人。FL Studio帮助我把脑海中的想法快速地变成一个…

开发者必备:动态贴纸和美颜SDK的集成教程

动态贴纸和美颜技术不仅能带来多样的拍摄方案&#xff0c;还可以增加应用的吸引力。本篇文章将为开发者提供动态贴纸和美颜SDK的集成教程、技术方案&#xff0c;帮助开发者快速实现这些功能。 一、动态贴纸美颜SDK集成教程 导入SDK 在Android Studio中&#xff0c;开发者需要…

柴油发电机供电技巧,太有用了!

随着现代工业和商业的发展&#xff0c;对可靠的电力供应的需求变得越来越重要。在许多场景中&#xff0c;柴油发电机作为备用电源成为了关键设备&#xff0c;用于应对停电或电力故障时的紧急情况。 然而&#xff0c;对于企业和组织来说&#xff0c;有效监控和管理柴油发电机的运…

自学黑客!告诉你如何规划

博主本人 18年就读于一所普通的本科学校&#xff0c;21年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全联合实验室。 我为啥说自学黑客 &#xff08;网络安全&#xff09;&#xff0c;一般人我还是劝你算了吧。因为我就是那个不一般的人。…