[LeetCode]516. Longest Palindromic Subsequence
516. Longest Palindromic Subsequence
动态规划
dp[i][j] = 2 + dp[i+1][j-1] (if s[i]==s[j])
dp[i][j] = max(dp[i+1][j], dp[i][j-1]) (else)
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return 0
l = len(s)
dp = [[0 for i in range(l)] for j in range(l)]
for i in range(l-1, -1, -1):
dp[i][i] = 1
for j in range(i+1, l):
if s[i] == s[j]:
dp[i][j] = 2 + dp[i+1][j-1]
else:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
return dp[0][l-1]
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return 0
l = len(s)
dp = [[1] * 2 for i in range(l)]
for j in range(1, l):
for i in range(j-1, -1, -1):
if s[i] == s[j]:
dp[i][j%2] = 2 + dp[i+1][(j-1)%2] if i + 1 <= j - 1 else 2
else:
dp[i][j%2] = max(dp[i+1][j%2], dp[i][(j-1)%2])
return dp[0][(l-1)%2]
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return 0
l = len(s)
dp = [0 for i in range(l)]
for i in range(l-1, -1, -1):
newdp = dp[:]
newdp[i] = 1
for j in range(i+1, l):
if s[i] == s[j]:
newdp[j] = 2 + dp[j-1]
else:
newdp[j] = max(dp[j], newdp[j-1])
dp = newdp[:]
return dp[l-1]
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法