最长回文子序列(LeetCode-516)

简介: 最长回文子序列(LeetCode-516)

最长回文子序列(LeetCode-516)


题目

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


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


示例 1:

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


示例 2:

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


提示:


1 <= s.length <= 1000

s 仅由小写英文字母组成


思路

五部曲


dp[i][j] 含义


在区间范围为 [ i , j ]  (注意左右都是闭区间)内的最长的回文子序列的长度

递推公式


当 s [ i ] ≠ s [ j ]时,只说明二者不能同时加入回文子串,可以分别加入求最大值,d p [ i ] [ j ] = m a x ( d p [ i + 1 ] [ j ] , d p [ i ] [ j − 1 ] )

当 s [ i ] = s [ j ] 时,d p [ i ] [ j ] = d p [ i + 1 ] [ j − 1 ] + 2


数组初始化


当下标 i = j  时,即一个字符的回文子序列长度应该为一

遍历顺序

要注意看当前元素依靠谁的状态获取,看到递推公式,就知道肯定对于 i 的遍历肯定要倒序。


代码展示

class Solution
{
public:
    int longestPalindromeSubseq(string s)
    {
        int n = s.size();
        if (n == 1)
        {
            return 1;
        }
        vector<vector<int>> dp(n, vector<int>(n));
        for (int i = n - 2; i >= 0; i--)
        {
            dp[i][i] = 1;
            for (int j = i + 1; j < n; j++)
            {
                if (s[i] == s[j])
                {
                    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];
    }
};
目录
相关文章
|
移动开发 前端开发
如何识别 String 里的 ‘\r\n‘ 让 HTML换行显示
如何识别 String 里的 ‘\r\n‘ 让 HTML换行显示
276 0
|
9月前
|
监控 算法 数据安全/隐私保护
使用Python实现批量文件的压缩处理
使用Python实现批量文件的压缩处理
124 0
|
9月前
|
存储 Kubernetes 容灾
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
|
9月前
|
消息中间件 大数据 Kafka
Kafka与大数据:消息队列在大数据架构中的关键角色
【4月更文挑战第7天】Apache Kafka是高性能的分布式消息队列,常用于大数据架构,作为实时数据管道汇聚各类数据,并确保数据有序传递。它同时也是数据分发枢纽,支持多消费者订阅,简化系统集成。Kafka作为流处理平台的一部分,允许实时数据处理,满足实时业务需求。在数据湖建设中,它是数据入湖的关键,负责数据汇集与整理。此外,Kafka提供弹性伸缩和容错保障,适用于微服务间的通信,并在数据治理与审计中发挥作用。总之,Kafka是现代大数据体系中的重要基础设施,助力企业高效利用数据。
460 1
|
9月前
|
jenkins Java 持续交付
详解如何使用Jenkins一键打包部署SpringBoot项目
详解如何使用Jenkins一键打包部署SpringBoot项目
681 0
|
6月前
|
算法
LeetCode第5题最长回文子串
该文章介绍了 LeetCode 第 5 题最长回文子串的解法,通过分析回文子串的特点,使用动态规划的思想,用二维数组记录字符串是否为回文串,从后往前遍历找子串,减少重复判断,最终找到最长回文子串,并总结了解题时通过举例推导找规律的思路。
LeetCode第5题最长回文子串
|
9月前
|
算法 搜索推荐 Shell
【408数据结构与算法】—希尔排序 Donald Shell(十七)
【408数据结构与算法】—希尔排序 Donald Shell(十七)
|
运维 安全 Java
从源码看Spring Security之采坑笔记(Spring Boot篇)
从源码看Spring Security之采坑笔记(Spring Boot篇)
194 0
从源码看Spring Security之采坑笔记(Spring Boot篇)

热门文章

最新文章