class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp = [[-1] * n for _ in range(n)]
def dfs(i, j):
if i < 0 or j == n:
return 0
if dp[i][j] != -1:
return dp[i][j]
if s[i] == s[j]:
length = 1 if i == j else 2
dp[i][j] = length + dfs(i - 1, j + 1)
else:
dp[i][j] = max(dfs(i - 1, j), dfs(i, j + 1))
return dp[i][j]
for i in range(n):
dfs(i, i) # odd length
dfs(i, i + 1) # even length
return max(max(row) for row in dp if row != -1)class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
cache = {}
def dfs(i, j):
if i > j:
return 0
if i == j:
return 1
if (i, j) in cache:
return cache[(i, j)]
if s[i] == s[j]:
cache[(i, j)] = dfs(i + 1, j - 1) + 2
else:
cache[(i, j)] = max(dfs(i + 1, j), dfs(i, j - 1))
return cache[(i, j)]
return dfs(0, len(s) - 1)class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
return self.longestCommonSubsequence(s, s[::-1])
def longestCommonSubsequence(self, s1: str, s2: str) -> int:
N, M = len(s1), len(s2)
dp = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(N):
for j in range(M):
if s1[i] == s2[j]:
dp[i + 1][j + 1] = 1 + dp[i][j]
else:
dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1])
return dp[N][M]class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp = [0] * n
for i in range(n - 1, -1, -1):
dp[i] = 1
prev = 0
for j in range(i + 1, n):
temp = dp[j]
if s[i] == s[j]:
dp[j] = prev + 2
else:
dp[j] = max(dp[j], dp[j - 1])
prev = temp
return dp[n - 1]