Leetcode 516. 最长回文序列 区间dp C++实现

news2024/9/30 5:25:49

Leetcode 516. 最长回文序列

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

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

算法1:记忆化搜索

        双指针,left 指针指向最左边,right 指针指向最右边,当 s [ left ] == s [ right ] 时,回文数 + 2 ,两者不相等时,左指针 left 右移或者右指针 right 左移。

时间复杂度:O(n²) 。

        其中 ns 的长度。动态规划的时间复杂度 = 状态个数 × 单个状态的转移个数。本题中状态个数等于 O(n²),而单个状态的转移个数为 O(1),因此时间复杂度为 O(n²)

空间复杂度:O(n²) 。

        保存多少状态,就需要多少空间。

代码:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.length();
        vector<vector<int>> memo(n,vector<int>(n,-1));
        auto dfs = [&](auto &&dfs,int left,int right) -> int{
            if(left > right)    return 0;
            if(left == right)   return 1;
            int& res = memo[left][right];
            if(res != -1)   return res;
            if(s[left] == s[right]) return dfs(dfs,left + 1,right - 1) + 2;
            return max(dfs(dfs,left + 1,right),dfs(dfs,left,right - 1));
        };
    return dfs(dfs,0,n - 1);
    }
};

算法2:1:1 翻译成递推

        如何思考循环顺序?什么时候要正序,什么时候要倒序?

        这里有一个通用的做法:盯着状态转移方程,想一想,要计算 dp [ i ] [ j ] ,必须先把 dp [ i + 1 ] [ ⋅ ] 算出来,那么只有 i 从大到小枚举才能做到。对于 j 来说,由于在计算 dp [ i ] [ j ] 的时候,需要用到 dp [ i ] [ j − 1 ] ,也就是必须先把 dp [ i ] [ j − 1 ] 算出来,所以 j 必须从小到大枚举。

时间复杂度:O(n²) 。

        其中 n s 的长度。动态规划的时间复杂度 = 状态个数 × 单个状态的转移个数。本题中状态个数等于 O(n²),而单个状态的转移个数为 O(1),因此时间复杂度为 O(n²)

空间复杂度:O(n²) 。

代码:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.length();
        vector<vector<int>> dp(n,vector<int>(n));
        for(int i = n - 1;i >= 0;i--){
            dp[i][i] = 1;
            for(int j = i + 1;j < n;j++)
                dp[i][j] = s[i] == s[j] ? dp[i + 1][j - 1] + 2 : max(dp[i][j - 1],dp[i + 1][j]);
        }
        return dp[0][n - 1];
    }
};

算法3:空间优化

        把 dp 数组的第一个维度去掉。相当于把 dp [ i ] dp [ i + 1 ] 保存到同一个一维数组中。

但一个萝卜一个坑,dp [ j − 1 ] 要么保存的是 dp [ i + 1 ] [ j −  1 ] ,要么保存的是 dp [ i ] [ j − 1 ] ,怎么妥当地处理新旧数据?对于本题来说,可以用变量 pre 记录 dp [ i + 1 ] [ j  − 1 ] 的值。计算到 dp [ j ] 时,dp [ j − 1 ] 保存的是新数据 dp [ i ] [ j − 1 ],旧数据 dp [ i + 1 ] [ j − 1 ] 可以从 pre 中取到。

时间复杂度:O(n²) ,其中 为 s 的长度。

空间复杂度:O(n) 

代码:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.length();
        vector<int> dp(n);
        for(int i = n - 1;i >= 0;i--){
            dp[i] = 1;
            int pre = 0;
            for(int j = i + 1;j < n;j++){
                int tmp = dp[j];
                dp[j] = s[i] == s[j] ? pre + 2 : max(dp[j],dp[j - 1]);
                pre = tmp;
            }
        }
        return dp[n - 1];
    }
};

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

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

相关文章

如何选择适合企业的高效财税自动化软件

数字化时代&#xff0c;企业财税管理的自动化已成为提高效率、降低成本的重要途径。然而&#xff0c;市面上众多的财税自动化软件让企业在选择合适的方案时感到困惑。本文金智维将介绍如何选择适合企业的高效财税自动化软件&#xff0c;以帮助企业更好地进行运营管理和决策。 1…

部署FileBeat采集日志发送到Kafka集群服务器

为什么要使用FileBeat Logstash功能虽然强大,但是他依赖java,在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而Filebeat就是一个完美的代替者,filebeat是Beat成员之一,基于Go语言开发,没有任何依赖,配置文件简单,格式明了,同时,…

快手自研Spark向量化引擎正式发布,性能提升200%

Blaze 是快手自研的基于Rust语言和DataFusion框架开发的Spark向量化执行引擎&#xff0c;旨在通过本机矢量化执行技术来加速Spark SQL的查询处理。Blaze在快手内部上线的数仓生产作业也观测到了平均30%的算力提升&#xff0c;实现了较大的降本增效。本文将深入剖析blaze的技术原…

见刊丨“GPU池化”术语发布

中国计算机学会(CCF)日前与趋动科技联合发布了“GPU池化”这一术语&#xff0c;并在《中国计算机学会通讯》总第198期刊中发表。 期刊第90/91页 目前&#xff0c;人工智能通过数据、算力、算法和场景的融合深入到各行各业&#xff0c;促进和赋能数智化转型。其中&#xff0c;强…

无人机在战争方面的应用!!!

01 侦察与监视 无人机能够进行长时间的侦察和监视&#xff0c;为指挥官提供实时的战场情报&#xff0c;是现代战争中不可或缺的“眼睛”。它们可以飞越敌方领空&#xff0c;收集情报&#xff0c;为军事决策提供关键信息。 02 精确打击 携带精确制导武器的无人机能够对敌方的…

OpenHarmony(鸿蒙南向开发)——标准系统移植指南(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统芯片移植指南(一) Op…

Acwing 区间合并

区间合并 主要思想&#xff1a;给定很多区间。若两个区间有交集&#xff0c;将二者合并成一个区间。 具体做法: 先按照区间的左端点进行排序然后遍历每个区间&#xff0c;根据不同的情况进行合并&#xff0c;有一下几种情况&#xff1a; 第一种情况&#xff0c;区间不变&…

VMware中安装win7和kail等虚拟机

主要内容 第一部分&#xff1a;安装win 7第二部分 安装kali第三部分 安装UbuntuUbuntu22.04上安装PwntoolsUbuntu上安装vim 第一部分&#xff1a;安装win 7 1.打开安装好的虚拟机 参考链接&#xff1a;虚拟机VMware安装windows7 64位操作系统&#xff08;图文版详解版&…

TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合

在国家信息安全和自主可控技术日益受到重视的背景下&#xff0c;国产软硬件的发展已成为推动数字经济的重要力量。随着全球科技竞争加剧&#xff0c;企业在选择技术解决方案时&#xff0c;越来越倾向于采用国产产品以降低对外部技术的依赖。这一趋势不仅是为了确保数据安全与隐…

VUE下拉选择分页,远程搜索

实现效果 实现思路 初始化加载第一页&#xff1b;监听下拉框的滚动事件&#xff0c;当滚动到底部的时候加载下一页&#xff1b;输入搜索时&#xff0c;重置为第一页加载&#xff1b;关闭下拉选择框时&#xff0c;判断如果存在搜索值&#xff0c;要清空搜索值、并加载第一页。 …

【运维方案】某系统运维需求方案参考(doc全原件2024)

系统运维需求方案 1服务目标 2服务人力需求、服务资源需求 3信息资产统计服务需求 4业务应用软件服务需求 5网络、安全系统运维服务需求 6主机、存储系统运维服务需求 7数据库系统运维服务需求 8终端运维服务需求 9综合布线系统服务需求 10大屏幕显示系统的维护需求 11视频会议…

2024年最新会声会影2025旗舰版新功能介绍及安装图文激活教程

会声会影2025是一款超级受欢迎的视频播放软件&#xff0c;用于剪辑和编辑各种类型的视频素材。软件具有直观的用户界面&#xff0c;使得即使对于初学者来说也能轻松上手。该软件提供了各种创意工具&#xff0c;可以帮助用户实现他们的创意想法。用户可以裁剪、合并和重新排列视…

SpringBootAdmin源码修改编译002_踩坑记录一堆坑_记录过程_没有成功---VUE工作笔记0027

当前版本是18.19.0 我本地安装的node npm install 执行的时候报错了.上面的错误 说node-ipc@9.2.2的版本 需要使用node 8 10 12 14 16 17的版本,而我安装的是 18.19.0的版本. 这个时候的解决方案是提升node-ipc组件的版本. 可以看到在npmjs网站上找到,对应的组件node-ipc 可…

Hazel 2024

不喜欢游戏的人也可以做引擎&#xff0c;比如 cherno 引擎的作用主要是有两点&#xff1a; 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件&#xff0c;称之为资产 assets 不做窗口类的应用栈&#xff0c;可能要花一年才能做一个能实际使用的应用&#xff0c;只需…

Axure RP 11 Beta 测试版 发布了,目前是免费试用阶段

Axure RP 11 Beta 已经发布上线了&#xff01;各位产品同学可以从下面的链接下载测试版&#xff0c;体验新功能。目前RP11处于免费试用阶段&#xff0c;没有授权的用户也可以免费使用试用版。 与 Axure RP 的以往版本一样&#xff0c;在 RP11 中保存文件后&#xff0c;无法在低…

redis有序集合写入和求交集的速度

背景 团队小伙伴做了一个需求。大概的需求是有很多的图片作品&#xff0c;图片作品有一些类别&#xff0c;每个人进入到每个类别的作品业&#xff0c;根据权重优先查看权重最高的的作品&#xff0c;权重大概是基于每个人对该作品的浏览计算&#xff0c;浏览过的作品放在最后展…

IDEA 通义灵码 插件使用体验

目录 前言 主要功能 演示代码 解释代码 生成单元测试 生成代码注释 生成优化建议 代码片段补全 总结 前言 自从 AI 技术开始大规模应用&#xff0c;老板就想让下面的牛马借助 AI 工具来提高编码效率&#xff0c;由于团队都没有在实际编码中深度使用过 AI 工具&#x…

消息中间件有哪些常见类型

消息中间件根据其设计理念和用途&#xff0c;可以大致分为以下几种常见类型&#xff1a; 点对点消息队列&#xff08;Point-to-Point Messaging Queues&#xff09;&#xff1a; 在这种模型中&#xff0c;消息被发送到特定的队列中&#xff0c;消费者从队列中取出并处理消息。队…

【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 困难 三【题目编号】 LCR 078.合并 K 个升序链表 …

Linux入门——“Linux基本指令”上

在刚开始学习Linux时&#xff0c;首先需要掌握一些基本指令&#xff0c;以便我们能更好地使用Linux操作系统&#xff0c;以下指令在Ubuntu 22上执行。以下内容不过多介绍选项内容。 1.ls指令 ls指令用来查看当前目录下的文件&#xff0c;显示的信息是很有限的一般只显示文件名&…