题目链接
解法一:动态规划
思路
代码
class Solution:
def longestPalindrome(self,s:str)->str:
n = len(s)
if n < 2:
return s
max_len = 1
begin = 0
# dp[i][j]表示s[i..j]是否是回文子串
dp = [[False]*n for _ in range(n)] # n行n列数组
for i in range(n):
dp[i][i]=True # 长度为1的字母,显然是回文串
#递推开始
#先枚举子串长度
for lenth in range(2,n+1):
#枚举左边界,左边界的上限设置可以宽松一些
for i in range(n):
#由lenth 和 i 可以确定右边界,即j-i+1=lenth得
j = lenth + i -1
#如果右边界越界,就可以退出当前循环
if j >= n:
break
if s[i] != s[j]:
dp[i][j] = False
else:
if j-i <3:
dp[i][j] = True
else:
dp[i][j] = dp[i+1][j-1]
#只要 dp[i][lenth] == true成立,就表示子串s[i..lenth] 是回文,此时记录回文长度和起始位置
if dp[i][j] and j-i+1 > max_len:
max_len = j-i+1
begin = i
return s[begin:begin + max_len]
代码未理解部分:
- for lenth in range(2,n+1)
- if j - i < 3: