首页 > 其他 > 详细

516. 最长回文子序列 力扣(中等) 序列dp,不会做

时间:2021-08-12 23:15:59      阅读:22      评论:0      收藏:0      [点我收藏+]

516. 最长回文子序列

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

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

 

示例 1:

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

 

题解:https://leetcode-cn.com/problems/longest-palindromic-subsequence/solution/gong-shui-san-xie-qu-jian-dp-qiu-jie-zui-h2ya/

https://leetcode-cn.com/problems/longest-palindromic-subsequence/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-dpzi-dv83q/

技术分享图片

 

代码:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
    // dp[i][j]:表示第i个字符到第j个字符之间,最长的回文子序列长度
    int dp[1005][1005];
    int l=s.length();
    memset(dp,0,sizeof(dp));
    for(int i=0;i<l;i++) dp[i][i]=1;
    for(int i=l-1;i>=0;i--)   // for(int i=0;i<l;i++)  因为看递推公式,需要借助下层结果,所以反着循环
      for(int j=i+1;j<l;j++)
      {
             if(i+1==j)
             {
                 if(s[i]==s[j]) dp[i][j]=2;
                     else dp[i][j]=1;
                continue;
             } 
            if (s[i]==s[j]) {dp[i][j]=dp[i+1][j-1]+2; continue;}
            if (s[i]!=s[j]) {dp[i][j]=max(dp[i+1][j],dp[i][j-1]); continue;}
      }
      return dp[0][l-1];
    }
};

 

516. 最长回文子序列 力扣(中等) 序列dp,不会做

原文:https://www.cnblogs.com/stepping/p/15134812.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!