LC 0516 [M] Longest Palindromic Subsequence - ALawliet/algorithms GitHub Wiki
https://www.youtube.com/watch?v=_nCsPn7_OgI&t=57s&ab_channel=TusharRoy-CodingMadeSimple
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
@lru_cache(None)
def dp(l, r):
if l > r: return 0 # Return 0 since it's empty string
if l == r: return 1 # Return 1 since it has 1 character
if s[l] == s[r]:
return dp(l+1, r-1) + 2 # [a]g[bdb][a]
return max(dp(l, r-1), dp(l+1, r))
return dp(0, n-1)
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
dp[i][i] = 1
for j in range(i+1, n):
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]
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp, dpPrev = [0] * n, [0] * n
for i in range(n - 1, -1, -1):
dp[i] = 1
for j in range(i+1, n):
if s[i] == s[j]:
dp[j] = dpPrev[j - 1] + 2
else:
dp[j] = max(dpPrev[j], dp[j - 1])
dp, dpPrev = dpPrev, dp
return dpPrev[n - 1]