当前位置: 首页 > article >正文

516.最长回文子序列

刷算法题:

第一遍:1.看5分钟,没思路看题解

2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。

3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法)

4.整理到自己的自媒体平台。

5.再刷重复的类似的题目,根据时间和任务安排刷哪几个板块

6.用c++语言 都刷过一遍了 就刷中等

一.题目

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

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

示例 1:

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

示例 2:

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

提示:

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

二、反思

1.自己的解法

2.题目的解法 

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n=s.length();
        vector<vector<int>> dp(n,vector<int>(n));
        //dp【i】【j】是i到j的最长子序列。
        for(int i=n-1;i>=0;i--){
            dp[i][i]=1;
            int c1=s[i];
            for(int j=i+1;j<n;j++){//只要是子序列这么做不断向后遍历,就等于删除了。
                int c2=s[j];
                if(c1==c2){
                    dp[i][j]=dp[i+1][j-1]+2;
                }else {
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
                
            }

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

 3.思路的异同

对于一个子序列而言,如果它是回文子序列,并且长度大于 2,那么将它首尾的两个字符去除之后,它仍然是个回文子序列。因此可以用动态规划的方法计算给定字符串的最长回文子序列。

用 dp[i][j] 表示字符串 s 的下标范围 [i,j] 内的最长回文子序列的长度。假设字符串 s 的长度为 n,则只有当 0≤i≤j<n 时,才会有 dp[i][j]>0,否则 dp[i][j]=0。(这里就强调了for遍历顺序)

由于任何长度为 1 的子序列都是回文子序列,因此动态规划的边界情况是,对任意 0≤i<n,都有 dp[i][i]=1。

当 i<j 时,计算 dp[i][j] 需要分别考虑 s[i] 和 s[j] 相等和不相等的情况:

如果 s[i]=s[j],则首先得到 s 的下标范围 [i+1,j−1] 内的最长回文子序列,然后在该子序列的首尾分别添加 s[i] 和 s[j],即可得到 s 的下标范围 [i,j] 内的最长回文子序列,因此 dp[i][j]=dp[i+1][j−1]+2;

如果 s[i]=s[j],则 s[i] 和 s[j] 不可能同时作为同一个回文子序列的首尾,因此 dp[i][j]=max(dp[i+1][j],dp[i][j−1])。

由于状态转移方程都是从长度较短的子序列向长度较长的子序列转移,因此需要注意动态规划的循环顺序。

最终得到 dp[0][n−1] 即为字符串 s 的最长回文子序列的长度。

三.进步的地方

 上一段直接封神


http://www.kler.cn/a/392667.html

相关文章:

  • 条件语句 - if, else, switch-case
  • 【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
  • C++ 面向对象编程:继承、继承方式
  • yolov5及其算法改进
  • EKF 自动匹配维度 MATLAB代码
  • kafka的备份策略:从备份到恢复
  • 通过wsl配置Qt的中文开发环境
  • 《操作系统 - 清华大学》3 -2:地址空间和地址生成
  • Vue的路由
  • 数据分析-系统认识数据分析
  • 快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)
  • 浏览器添加翻译扩展
  • 系统架构设计师(第二版)常见英语(更新中)
  • Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南
  • 字节、快手、Vidu“打野”升级,AI视频小步快跑
  • 卷积神经网络CNN
  • 使用 Sparkle 实现 macOS 应用自定义更新弹窗
  • DRL算法:DRL算法的核心;AlphaGo中,深度学习和强化学习的具体体现;当前最流行的深度强化学习(DRL)模型PPO
  • 二、神经网络基础与搭建
  • 网站架构知识之Ansible剧本(day022)
  • Qt 正则表达式提取文件中的 USB 设备 ID
  • Spring Boot 启动时自动配置 RabbitMQ 交换机、队列和绑定关系
  • Anolis8.2系统中搭建python环境
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • vue3+ts+antd 运行报错 convertLegacyToken is not a function
  • SQL集合运算