1、题目概述
给定一个字符串s, 求其回文子串, 子串是连续的
此类问题可以衍变为最长回文子串, 回文子串个数等等
如果字符串向前和向后读都相同,则它满足 回文性
2、动态规划解题思路
1、 单个字符一定是回文的, 比如a, b
2、 2个连续相等的字符也一定是回文的, 比如aa, bb
3、 用dp[i,j]表示范围从i到j的字符串是否是回文的,那么如果字符串长度超过2且dp[i][j] 是回文的, 则dp[i+1][j-1]也一定是回文的,即
一个字符串如果是回文的, 如果去头去尾, 剩下的字符串也一定是回文的
- 用二维数组来表示dp,
dp[i+1][j-1]在dp[i][j]的左下角,所以i的遍历顺序是从下往上,j的遍历顺序是从左到右, 因为推导式是是需要先知道i+1和j-1的,同时j从i的起始位置开始遍历, 因为j一定大于等于i

3、 LeetCode 5 最长回文子串
class Solution:
def longestPalindrome(self, s: str) -> str:
length = len(s)
maxLength = 1
begin = 0
# 初始化的时候全置为False
dp = [[False] * length for _ in range(length)]
for i in range(length - 1, -1, -1): # i从下往上遍历
for j in range(i, length): # j从左往右遍历
if s[i] == s[j]:
# 一头一尾相等, 且长度不超过2, 证明是回文的
if j - i <= 1:
dp[i][j] = True
# 以下是处理结果逻辑
if j - i + 1 > maxLength:
maxLength = j - i + 1
begin = i
# 如果去头去尾也是回文的, 说明当前[i, j]也必然是回文的
elif dp[i+1][j-1]:
dp[i][j] = dp[i+1][j-1]
# 以下是处理结果逻辑
if j - i + 1 > maxLength:
maxLength = j - i + 1
begin = i
return s[begin: begin + maxLength]