516. 最长回文子序列
https://leetcode-cn.com/problems/longest-palindromic-subsequence/submissions/
解法一:dp
用dp[i][j]
表示s[i...j]
的最长回文子序列 当s[i] == s[j]
时,s[i...j]
的最长回文子序列由s[i+1...j-1]
与头尾的s[i]
和s[j]
构成,即dp[i][j] = dp[i+1][j-1]+2
当s[i] != s[j]
时,s[i...j]
的最长回文子序列就是s[i+1...j]
和s[i...j-1]
中较长的,即dp[i][j] = max(dp[i+1][j], dp[i][j-1])
边界:串长度为1,即i==j时,dp[i][j]=1
;i<j时,dp[i][j]=0
,因此只需要遍历上三角矩阵
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
if n == 1:
return n
dp = [[0] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
for j in range(i, n):
if i == j: #对角线
dp[i][j] = 1
continue
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])
return dp[0][n-1]
最后更新于