516. 最长回文子序列

516. 最长回文子序列

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

示例 1:
输入:

"bbbab"

输出:

4

一个可能的最长回文子序列为 “bbbb”。

示例 2:
输入:

"cbbd"

输出:

2

一个可能的最长回文子序列为 “bb”。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母

递归

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        def helper(left,right):
            if left>right:
                return 0
            if left==right:
                return 1
            if s[left]==s[right]:
                return 2+helper(left+1,right-1)
            else:
                return max(helper(left+1,right),helper(left,right-1))
        return helper(0,len(s)-1)
  • 就是看首位left跟right两个位置对应的字符是否相等,假如相等就返回2+helper(left+1,right-1)
  • 不相等就返回max(helper(left+1,right),helper(left,right-1))

动态规划

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        n=len(s)
        map=[[0]*n for i in range(n)]
        for right in range(n):
            map[right][right]=1
            for left in range(0,right)[::-1]:
                if s[left]==s[right]:
                    map[left][right]=map[left+1][right-1]+2
                else:
                    map[left][right]=max(map[left+1][right],map[left][right-1])
        return map[0][n-1]
  1. 跟上面的一样的思路不过是自下而上,这样使用一个map来储存前面计算的结果,动态规划的思路来做这道题。

你可能感兴趣的:(数据结构与算法课程)