题目描述:
dj思路:
首先,要理解回文子串的一个特点就是掐头去尾仍然是回文子串
然后,就可以知道s[i:j+1]是否是回文子串取决于s[i+1:j]是否是回文子串(状态转移)
最后,可以使用二维dp来解决这题,
第一步,明确状态转移方程
第二步,这题要使用逆向递归的思路,因为正向递归无法知道i+1的状态,
代码:
class Solution:
def longestPalindrome(self, s: str) -> str:
# dp,首先要理解一个子串是回文子串,掐头去尾也是回文子串
# 动态规划的要点是状态转移方程的确定
n = len(s)
dp = [[False for _ in range(n)] for _ in range(n)]
res = s[0]
for i in range(n, -1, -1):
for j in range(i, n):
if i == j:
dp[i][j] = True
elif 0 < j - i <= 2:
if s[i] == s[j]:
dp[i][j] = True
else:
dp[i][j] = False
else:
if s[i] == s[j] and dp[i+1][j-1] == True:
dp[i][j] = True
else:
dp[i][j] = False
if dp[i][j] and j - i + 1 > len(res):
res = s[i:j+1]
return res