1、回文子串
class Solution:
def countSubstrings(self, s: str) -> int:
# dp含义:dp[i][j]表示[i,j]子串是否是回文的
result = 0
dp = [[False]*(len(s)) for i in range(len(s))]
# 因为计算dp[i][j]需要dp[i+1][j-1](左下的值)
# 所以遍历顺序应该是从下到上从左到右
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:
dp[i][j] = True
result += 1
# 如果i j中间的部分都是回文的,那两边字母相等就也是回文的
elif dp[i+1][j-1]:
dp[i][j] = True
result += 1
return result
2、最长回文子序列
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
# dp含义:dp[i][j]表示[i,j]子串是否是回文的
dp = [[0]*(len(s)) for i in range(len(s))]
# 初始化:每个字母都是一个长度为1的回文串
for i in range(len(s)):
dp[i][i] = 1
# 因为计算dp[i][j]需要dp[i+1][j-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+1][j], dp[i][j-1])
return dp[0][-1]