516. 最长回文子序列
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
# 本题的核心是怎么进行状态转移
# 对于 s[l] != s[r]的情况下,s[l:r]中的最大回文子序列来自于 max(s[l:r-1],s[l+1,r])
dp = [[0]*len(s) for _ in range(len(s))]
lenS = len(s)
for i in range(lenS):
dp[i][i] = 1
# 对DP数组,数组边界分析
# 1. 对于左边界,在更新DP时需要取到i+1,所以i是倒序遍历
# 2. 对于右边界,其在左边界右边并且不能重合所以是 range(l+1,lenS)
for l in range(lenS-2,-1,-1):
for r in range(l+1,lenS):
if s[l] == s[r]:
dp[l][r] = dp[l+1][r-1]+2
else:
dp[l][r] = max(dp[l+1][r],dp[l][r-1])
return dp[0][-1]

浙公网安备 33010602011771号