Given a string s
, find the longest palindromic subsequence's length in s
.
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: s = "bbab" Output: 3 Explanation: One possible longest palindromic subsequence is "bbb".
解题思路:生成矩阵,其中只有右上半角有用,表示s[i : j+1](左闭右开)的最长回文子列。从对角线开始更新,矩阵A第一行最后一个元素就是我们所求结果。
具体求解过程:
1.初始化矩阵。
2. 依次对如图所示的斜对角元素进行更新:
2.1. 因为表示s[i : j+1]的最长回文子列,当s[i : j+1]长度为2时:
我只需要判断二者是否相等,是=》最长回文=2,
否=》最长回文=1。
2.2 当s[i : j+1]长度大于2时:
判断首尾元素是否相等:是=》2+除去首尾元素的最长回文数
否=》 max(除去首最长回文数,除去尾最长回文数)
3. 返回A的第一行最后一列
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
N = len(s)
pal = []
for i in range(N):
pal.append([1]*N)
for i in range(1,N):
for j in range(0,N-i):
if s[j] == s[j+i]:
if i == 1:
pal[j][j+i] = 2
else:
pal[j][j+i] = 2 + pal[j+1][j+i-1]
else:
pal[j][j+i] = max(pal[j][j+i-1],pal[j+1][j+i])
return pal[0][N-1]