leetcode - [字符串、动态规划] - (2)最长回文子序列

1、问题描述

给定一个字符串s,找到其中最长的回文子序列,并输出其最大长度。可以假设s的最大长度为1000。
例如:输入的字符串s=“bbbab”,这时最长的回文子序列为"bbbb",长度为4,所以输出为4

2、解题思路

  • 边界条件:输入字符串s为空,直接返回0。
  • 思路1:这道题和leetcode - [字符串、动态规划] - (1)最大回文子串类似。只不过这里子序列中出现的字符在原字符串中可以是不连续的,而子串则要求必须连续。所以这道题仍然采用动态规划方法,具体步骤如下:
  • (一)定义状态
  • f [ i ] [ j ] f[i][j] f[i][j]表示子串 s [ i , j ] s[i,j] s[i,j]中最长回文子序列的长度;
  • (二)定义状态转移方程
  • 1、如果 s s s的第 i i i个字符和第 j j j个字符相同的话,
  • f [ i ] [ j ] = f [ i + 1 ] [ j − 1 ] + 2 f[i][j]=f[i+1][j-1] + 2 f[i][j]=f[i+1][j1]+2
  • 2、如果 s s s的第 i i i个字符和第 j j j个字符不同的话,
  • f [ i ] [ j ] = m a x { f [ i + 1 ] [ j ] , f [ i ] [ j − 1 ] } f[i][j]=max\{f[i+1][j],f[i][j-1]\} f[i][j]=max{f[i+1][j]f[i][j1]}
  • 3、注意,在计算二维数组 f f f的值时,应该从上三角的最下面开始, i i i n − 1 n-1 n1变到 0 0 0 j j j i + 1 i+1 i+1 n − 1 n-1 n1,以确保每个子问题都已经算好了。
  • (三)初始化
  • f [ i ] [ i ] = 1 f[i][i]=1 f[i][i]=1,单个字符的最长回文子序列长度为1。
  • (四)结果
  • f [ 0 ] [ n − 1 ] f[0][n-1] f[0][n1]

3、代码实现

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        maxlen = 0
        
        if len(s) != 0:
            
            pl = [[0] * len(s) for i in range(0,len(s))]
            
            for l in range(0,len(s)):
                l = len(s) - 1 - l
                pl[l][l] = 1
                for r in range(l + 1,len(s)):
                    if s[l] == s[r]:
                        pl[l][r] = pl[l+1][r-1] + 2
                    else:
                        pl[l][r] = max(pl[l+1][r],pl[l][r-1])
            
            maxlen = pl[0][len(s) - 1]
        
        return maxlen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert_YuHan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值