leetcode516. 最长回文子序列

博客介绍了如何利用动态规划解决LeetCode上的516题,即寻找给定字符串中最长的回文子序列。文章详细阐述了dp数组的定义,解释了如何通过子问题推导出dp[i][j]的值,并给出了两种情况的处理方式:字符相等和不等。最终,目标是找到dp[0][n - 1],即整个字符串的最长回文子序列长度。
摘要由CSDN通过智能技术生成

传送门

题目:给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。

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

我们说这个问题对 dp 数组的定义是:

在子串 s[i..j] 中,最长回文子序列的长度为 dp[i][j]

一定要记住这个定义才能理解算法。

为啥这个问题要这样定义二维的 dp 数组呢?

我们多次提到,找状态转移需要归纳思维,说白了就是如何从已知的结果推出未知的部分,这样定义容易归纳,容易发现状态转移关系。
在这里插入图片描述

具体来说,如果我们想求 dp[i][j],如上图我们已经知道了子问题 dp[i+1][j-1]=3 (s[i+1..j-1] 中最长回文子序列的长度),你是否能想办法算出 dp[i][j] 的值(s[i…j] 中,最长回文子序列的长度)呢?

可以!这取决于 s[i] 和 s[j] 的字符:

Case1:如果它俩相等,那么它俩加上 s[i+1…j-1] 中的最长回文子序列就是 s[i…j] 的最长回文子序列:
在这里插入图片描述

Case2:如果它俩不相等,说明它俩不可能同时出现在 s[i…j] 的最长回文子序列中,那么把它俩分别加入 s[i+1…j-1] 中,看看哪个子串产生的回文子序列更长即可:
在这里插入图片描述
以上两种情况写成代码就是这样&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值