5. 最长回文子串
中心拓展法
class Solution:
def longestPalindrome(self, s: str) -> str:
n=len(s)
if n<2:
return s
maxlength=0
for i in range(n):
left,right=self.islongest(i,i,s)
left2,right2=self.islongest(i,i+1,s)
if maxlength<(right-left+1):
maxlength=right-left+1
start,end=left,right
if maxlength<(right2-left2+1):
maxlength=right2-left2+1
start,end=left2,right2
return s[start:end+1]
def islongest(self,left,right,s):
while left>=0 and right<len(s) and left<=right:
if s[left]==s[right]:
left-=1
right+=1
else:
break
return left+1,right-1
动态规划-----左右边界
dp=[[False]*n for _ in range(n)]
for i in range(n):
dp[i][i]=True
maxlength=1
start,end=0,0
for right in range(1,n):
for left in range(right):
if s[right]==s[left]:
if right-left==1:
dp[left][right]=True
else:
dp[left][right]=dp[left+1][right-1]
else:
continue
if dp[left][right] and maxlength<(right-left+1):
start=left
end=right
maxlength=right-left+1
return s[start:end+1]
动态规划------长度+边界
for L in range(2,n+1):
for i in range(n-L+1):
j=i+L-1
if s[i]!=s[j]:
continue
else:
if j-i<3:
dp[i][j]=True
else:
dp[i][j]=dp[i+1][j-1]
if dp[i][j] and L>maxlength:
maxlength=L
start=i
return s[start:start+maxlength]