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(i, len(s)): if s[i] == s[j] and (j - i <= 1 or dp[i+1][j-1]): result += 1 dp[i][j] = True return result 516.最长回文子序列 class Solution: def longestPalindromeSubseq(self, s: str) -> int: @cache # 缓存装饰器,避免重复计算 dfs 的结果(记忆化) def dfs(i: int, j: int) -> int: if i > j: return 0 # 空串 if i == j: return 1 # 只有一个字母 if s[i] == s[j]: return dfs(i + 1, j - 1) + 2 # 都选 return max(dfs(i + 1, j), dfs(i, j - 1)) # 枚举哪个不选 return dfs(0, len(s) - 1)