[leetCode-516Longest Palindromic Subsequence]最长回文子序列DP算法详解

本文详细解析了LeetCode第516题——最长回文子序列的动态规划解决方案。通过分治策略,当字符串中对应字符相等时,最长回文子序列长度加2;不等时,取去掉头尾字符后的最大回文子序列长度。最后讨论了递归实现的时间复杂度问题。
摘要由CSDN通过智能技术生成

一、题目描述
问题较为简单,给定一个字符串,如"aasasbc",计算出该字符串中最长的回文子序列长,即为"aaa"的长度3,回文子序列是指顺序和倒序均为同一个字符串的序列,另外,要求所输入的字符串长度不大于1000。
二、思路解析
分治算法去解决这道题是第一思路,即对于一个长度为n的字符串,对应于一个分治算法的状态数组dp[n-1][n-1],该数组的值对应字符串中最长回文子序列的长度,如dp[i][j]则代表着字符串中第i位到第j位的子序列中的最长回文子序列长度为dp[i][j],明确这一点后,我们要作的即为求出dp[0][n-1]的值并输出即可。
利用分治算法的思想,当某子串s(i,j)中s[i]与s[j]相等时,那么其头尾两字符一定位于其最长回文子串中,因此该子串的最长回文子序列长度等于去掉头尾两字符后新子串的最长回文子序列长度加二,我们可制定公式如下:dp[i][j] = dp[i + 1][j - 1] + 2。当s[i]与s[j]不相等时,则dp[i][j] = max(de[i + 1][j],dp[i][j - 1])。有了这个规则,我们接下来只需要遍历出该字符串s的每一个子串,即dp数组中的每一个值,最终输出dp[0][n-1]。
三、代码实现
根据分治算法,首先想到的是函数递归,这种方法虽然能得到正确的结果,但是时间复杂度却不能满足题目要求ÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值