647回文子串
class Solution:
def countSubstrings(self, s: str) -> int:
dp = [[False] * len(s) for _ in range(len(s))]
result = 0
for i in range(len(s) - 1, -1, -1):
for j in range(len(s)):
if s[i] == s[j]:
if i == j or j - i == 1:
dp[i][j] = True
result += 1
elif j - i > 1:
if dp[i + 1][j - 1] == True:
dp[i][j] = True
result += 1
else:
dp[i][j] = False
return result
516最长回文子序列
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
dp = [[0] * len(s) for _ in range(len(s))]
for i in range(len(s)):
dp[i][i] = 1
for i in range(len(s) - 1, -1, -1):
for j in range(i + 1, len(s)):
if s[i] == s[j]:
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][len(s) - 1]