LeetCode-最长回文序列——D15【一般难度】

题目描述

Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000.

Example 1:
Input:

“bbbab”
Output:
4
One possible longest palindromic subsequence is “bbbb”.
Example 2:
Input:

“cbbd”
Output:
2
One possible longest palindromic subsequence is “bb”.

注意是最长子序列,不要求连续

算法思路

如果一个字符串是回文串,那么在它左右分别加上一个相同的字符,那么它一定还是一个回文串,因此回文长度增加2
如果一个字符串不是回文串,或者在回文串左右分别加不同的字符,得到的一定不是回文串,因此回文长度不变,我们取[i][j-1]和[i+1][j]的较大值
[i][j]表示从第i个元素到第j个元素之间的最长回文序列

我们可以用 dp[i][j] 表示 s 中从 i 到 j(包括 i 和 j)的回文序列长度, 状态转移方程只是将上面的描述转化为代码即可:

if (s[i] === s[j]) {
  dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
  dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
}

算法实现

class Solution():
    def longestPalindromeSubseq (self,s):
        s=list(s)
        length=len(s)
        dp=[[0 for i in range(length)] for j in range(length)]
        print(dp)
        for i in range(length-1,-1,-1):
            dp[i][i]=1
            for j in range(i+1,length):
                if s[i]==s[j]:
                    dp[i][j]=dp[i+1][j-1]+2
                else:
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1])
        print(dp)            
        return dp[0][-1]#从第0号元素到最后一个元素之间的最长回文序列
    
test=Solution()
print(test.longestPalindromeSubseq("bbbab"))

注意:初始化二维数组的时候不能使用dp=[[0]*5]*5,因为这样的话你改变一行中的元素,所有行的元素都会改变。
比如令 dp[0][1]=1,则第0、2、3和4行中的第一个元素也会变为1。

发布了205 篇原创文章 · 获赞 655 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_33414271/article/details/99610711
D15