这道题的解答有些特殊,dp表示的是i-j范围的字符串是否为回文子串 递归遍历顺序也是重点
class Solution :
def countSubstrings ( self, s: str ) - > int :
dp = [ [ False ] * ( len ( s) ) for _ in range ( len ( s) ) ]
res = 0
for i in range ( len ( s) - 1 , - 1 , - 1 ) :
for j in range ( i, len ( s) ) :
if s[ i] == s[ j] :
if j- i<= 1 or dp[ i+ 1 ] [ j- 1 ] :
res += 1
dp[ i] [ j] = True
return res
516. 最长回文子序列
V1: 最长回文子序列==S和倒序S最长公共子序列 V2: 按照上一题回文的思路 dp[i][j] = 1 / dp[i+1][j-1]+2 // max(dp[i+1][j],dp[i][j-1])
class Solution :
def longestPalindromeSubseq ( self, s: str ) - > int :
dp = [ [ 0 ] * ( len ( s) + 1 ) for _ in range ( len ( s) + 1 ) ]
for i in range ( len ( s) ) :
for j in range ( len ( s) ) :
if s[ len ( s) - 1 - i] == s[ j] :
dp[ i+ 1 ] [ j+ 1 ] = dp[ i] [ j] + 1
else :
dp[ i+ 1 ] [ j+ 1 ] = max ( dp[ i] [ j+ 1 ] , dp[ i+ 1 ] [ j] )
return dp[ - 1 ] [ - 1 ]
class Solution :
def longestPalindromeSubseq ( self, s: str ) - > int :
dp = [ [ 0 ] * len ( s) for _ in range ( len ( s) ) ]
for i in range ( len ( s) - 1 , - 1 , - 1 ) :
for j in range ( i, len ( s) ) :
if s[ i] == s[ j] :
if i== j:
dp[ i] [ j] = 1
else :
dp[ i] [ j] = dp[ i+ 1 ] [ j- 1 ] + 2
else :
dp[ i] [ j] = max ( dp[ i] [ j- 1 ] , dp[ i+ 1 ] [ j] )
return dp[ 0 ] [ - 1 ]