Medium
Longest Palindromic Subsequence II — Python
Full explanation · Time O(n^2) · Space O(n)
# Time: O(n^2)
# Space: O(n)
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
dp = [[[0]*26 for _ in xrange(len(s))] for _ in xrange(2)]
for i in reversed(xrange(len(s))):
for j in xrange(i+1, len(s)):
if i == j-1:
if s[j] == s[i]:
dp[i%2][j][ord(s[i])-ord('a')] = 2
else:
for k in xrange(26):
if s[j] == s[i] and ord(s[j])-ord('a') != k:
dp[i%2][j][ord(s[j])-ord('a')] = max(dp[i%2][j][ord(s[j])-ord('a')], dp[(i+1)%2][j-1][k]+2)
dp[i%2][j][k] = max(dp[i%2][j][k], dp[i%2][j-1][k], dp[(i+1)%2][j][k], dp[(i+1)%2][j-1][k])
return max(dp[0][-1])