leetcode 516:最长回文子序列

本文介绍了如何解决LeetCode上的第516题——最长回文子序列。通过深入解析问题,我们使用动态规划方法来找出给定字符串的最长回文子序列。文章详细阐述了动态规划的状态转移方程和实现过程,并提供了相关代码示例,帮助读者理解并掌握解决此类问题的技巧。
摘要由CSDN通过智能技术生成

leetcode 516. 最长回文子序列


题目描述:给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
解题步骤:解决此类问题可以采用动态规划 dp[i][j]表示从第i个字符到第j个字符之间的最长回文子串。该问题类似于01背包问题
1、 状态定义:dp[i][j] 表示从第i个字符到第j个字符之间的最长回文子串的长度
2、 状态转移方程
如果第i个字符和第j个字符相同,则等于第i+1到j-1字符之间的最长子串加上2
dp [i][j] = dp [i + 1][j - 1] + 2 (s[i]==s[j])
如果第i个字符和第j个字符不同,则需要计算i和j之间子串的最大值,也即是分别i向右移动或j向左移动
dp [i][j] = max(dp[i + 1][j], dp[i][j - 1]) (s[i]!=s[j])
由于在计算dp[i][j]的时候需要提前知道dp[i+1][j]所以i从字符串最后往前遍历,dp[i][j-1]需要知道[j-1]所以j需要从前往后遍历,并且为了使计算不重复,j需要从i+1开始。
3、 初始化:dp[i][i] = 1 单个字符的最长回文序列是 1,只需要在第一个for循环即i对应的for循环中赋值就行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值