day165—递归—最长回文子序列(LeetCode-516)

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 1000
  • s仅由小写英文字母组成

解决方案:

这段代码是基于记忆化递归求解字符串最长回文子序列(LPS)的实现,在原有递归框架上优化了字符串传参方式,并调整了状态转移的分支逻辑,核心思路是通过递归 + 缓存避免重复计算,从子串两端向中间收敛求解最长回文子序列长度。

核心逻辑

  1. 核心定义

    • memo:二维记忆化数组(len×len),memo[begin][end]缓存子串s[begin..end]的最长回文子序列长度,初始值-1标记 “未计算”,避免重复递归;
    • dfs(begin, end, s):返回子串s[begin..end]的最长回文子序列长度,s传引用(string&)避免超长字符串拷贝。
  2. 递归边界

    • begin > end(子串为空):返回 0(空串无回文子序列);
    • begin == end(子串仅 1 个字符):返回 1(单个字符自身是长度为 1 的回文子序列)。
  3. 记忆化优化:递归开始时先检查memo[begin][end] != -1,若命中缓存则直接返回结果,将时间复杂度从纯递归的O(2n)降至O(n2),大幅提升效率。

  4. 核心状态转移

    • s[begin] == s[end](子串两端字符相等):最长回文子序列长度 = 中间子串(begin+1end-1)的结果 + 2(两端字符各贡献 1 位);
    • s[begin] != s[end](子串两端字符不等):最长回文子序列长度 = 删左字符(begin+1end)或删右字符(beginend-1)结果的最大值;
    • 最终再通过max(ret, max(...))二次校验,确保覆盖所有可能的回文子序列场景(避免分支逻辑遗漏最优解)。
  5. 主函数逻辑:初始化记忆化数组,调用dfs(0, len-1, s)计算整个字符串的最长回文子序列长度并返回。

关键特点

  • 效率优化:字符串传引用减少拷贝开销,记忆化缓存避免重复递归,适配中短长度字符串;
  • 逻辑冗余但安全:二次调用max(dfs(begin+1,end,s), dfs(begin,end-1,s))虽有冗余(两端不等时已计算过),但能确保结果不遗漏最优解;
  • 边界清晰:覆盖空串、单字符等基础场景,结果无偏差。

总结

  1. 核心思路:通过记忆化递归从子串两端向中间收敛,利用 “两端相等 + 2、不等取删左 / 删右最大值” 的规则求解最长回文子序列;
  2. 关键设计:memo数组是效率核心,传引用是性能优化核心,二次max校验是结果安全核心;
  3. 局限性:超长字符串(如全a的千级长度)仍会因递归栈溢出失效,需结合全相同字符特殊优化或迭代 DP。

函数源码:

class Solution { public: vector<vector<int>> memo{}; int dfs(int begin,int end,string& s){ if(begin>end) return 0; if(begin==end) return 1; int ret=0; if(memo[begin][end]!=-1){ return memo[begin][end]; } if(s[begin]==s[end]){ ret = dfs(begin+1,end-1,s)+2; } else{ ret = max(dfs(begin+1, end, s), dfs(begin, end-1, s)); } ret = max(ret,max(dfs(begin+1,end,s),dfs(begin,end-1,s))); memo[begin][end]=ret; return ret; } int longestPalindromeSubseq(string s) { int len=s.length(); memo.assign(len,vector<int>(len,-1)); return dfs(0,len-1,s); } };

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

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

相关文章

Java毕设项目:基于springboot的西安秦岭野生动物园智能化管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2025.12.20 作业 - # P13339 [EGOI 2025] Gift Boxes / 礼品盒

2025.12.20 作业 - # P13339 [EGOI 2025] Gift Boxes / 礼品盒题目描述 今年的 EGOI 在波恩举办。主办方希望为比赛中的每支队伍最多分发一个礼品盒,每支队伍的编号为 \(0\) 到 \(T-1\)。所有参赛选手排成一排,但他们…

2025.12.20 作业 - # P12134 [蓝桥杯 2025 省 B] 画展布置

2025.12.20 作业 - # P12134 [蓝桥杯 2025 省 B] 画展布置题目描述 画展策展人小蓝和助理小桥为即将举办的画展准备了 \(N\) 幅画作,其艺术价值分别为 \(A_1, A_2, \dots , A_N\)。他们需要从这 \(N\) 幅画中挑选 \(M…

信号处理仿真:傅里叶变换与频谱分析_(6).非周期信号的频谱分析

非周期信号的频谱分析 1. 引言 在信号处理领域&#xff0c;非周期信号的频谱分析是一个重要的课题。非周期信号在自然界和工程应用中广泛存在&#xff0c;例如语音信号、雷达回波信号、生物医学信号等。傅里叶变换&#xff08;Fourier Transform&#xff09;是频谱分析的核心工…

Java计算机毕设之基于springboot的饰品商城系统基于SpringBoot+Vue的饰品商城系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

ARM Cortex-M 存储器系统中的栈存储

ARM Cortex-M 存储器系统中的栈存储 本文来自于我关于ARM Cortex-M 的存储器系统的系列文章。欢迎阅读、点评与交流~ 1、ARM Cortex-M 的存储器系统特性 2、ARM Cortex-M 存储器映射 3、ARM Cortex-M 存储器系统中的栈存储 文章目录ARM Cortex-M 存储器系统中的栈存储一、栈的基…

Java毕设选题推荐:基于Vue的野生动物园智能化管理系统基于springboot的西安秦岭野生动物园智能化管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java毕设项目:基于springboot的日报管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

第十二章 容器化与部署

第十二章 容器化与部署 容器化是微服务架构的基石。没有容器,微服务的独立部署、环境一致性和快速扩展都将无从谈起。这一章,我想分享一些实战经验,帮助你掌握.NET微服务的容器化艺术。 12.1 Docker实战:从入门到精…

Java毕设项目:基于springboot的饰品商城系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

第十三章 安全实践

第十三章 安全实践 在微服务架构中,安全不再是单一应用的问题,而是分布式系统的核心挑战。我见过太多团队因为忽视安全而导致数据泄露、服务瘫痪。安全需要从一开始就融入架构设计,而不是事后补救。 13.1 API安全:…

【课程设计/毕业设计】基于springboot的企业日报管理日报管理系统设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Linux中批量修改文件名的方法

使用 rename 命令&#xff1a; rename s/\.jpg$/\.png/ *.jpg 这里的s代表替换操作&#xff0c;\.jpg$是匹配.jpg文件名的正则表达式&#xff0c;\.png是新文件名的格式。

第十五章 故障处理与运维

第十五章 故障处理与运维 在微服务架构中,系统的复杂性和分布式特性使得故障处理和运维变得尤为重要。单个服务的故障可能通过服务依赖链扩散,影响整个系统的可用性。因此,构建一个具备高可用性、容错性和可恢复性的…

【课程设计/毕业设计】基于web的饰品商城的设计与实现基于springboot的饰品商城系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于springboot的日报管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

第十六章 电商系统微服务实战(完结,总结以及之前所有内容会发到github)

第十六章 电商系统微服务实战 理论学得再多,不如亲手做一个项目。这一章,我将带你从零开始构建一个真实的电商微服务系统。这不是玩具项目,而是考虑了生产环境各种复杂情况的真实案例。 16.1 需求分析与架构设计 16…

Java计算机毕设之基于springboot的日报管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Hello World:一个后端程序员的碎碎念与新开始

Hello World! 敲下这行字的时候,感觉就像当年第一次在控制台打印出 Hello World 一样,既熟悉又带着一点仪式感。 作为一个在代码世界里摸爬滚打有些年头的 Java 后端开发,我想是时候搭建一个属于自己的“独立服务器…

计算机Java毕设实战-基于springboot的饰品商城系统基于Java Web的饰品商城系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…