题目
思路
1.中心扩展法,枚举每个字符为中心 向两遍扩展。
2.马拉车
代码
中心扩展法
class Solution:
def longestPalindrome(self, s: str) -> str:
ans=1
ansl=0;
ansr=0
for i in range(len(s)):
l=i-1
r=i+1
res=1
while(l>=0 and r<len(s) and s[l]==s[r]):
res+=2
l-=1
r+=1
if ans<res:
ans=res
ansl=l+1
ansr=r-1
if i+1<len(s) and s[i]==s[i+1]:
l=i-1
r=i+2
res=2
while(l>=0 and r<len(s) and s[l]==s[r]):
res+=2
l-=1
r+=1
if ans<res:
ans=res
ansl=l+1
ansr=r-1
return s[ansl:ansr+1]
马拉车
class Solution:
def longestPalindrome(self, s: str) -> str:
n=len(s)
if n==0:
t='^$'
else:
t="^"
for i in range(0,n):
t=t+'#'+s[i]
t=t+'#$'
print(t)
l=len(t)
p=[0]*l
c,r=0,0
for i in range(1,l-1):
duichen=2*c-i
if r>duichen:
p[i]=min(r-i,p[duichen])
else:
p[i]=0
while(t[i-p[i]-1]==t[i+p[i]+1]):
p[i]=p[i]+1
if i+p[i]>r:
c=i;
r=p[i]
maxc=0
maxr=0
for i in range(0,l):
if p[i]>maxr:
maxr=p[i]
maxc=i
start=(maxc-maxr)//2
return s[start:start+maxr]