给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
1.中心扩展法
哔哩哔哩教程
def getCenter(self,s,i,j):
while i>=0 and j<len(s) and s[i]==s[j]:
i-=1;
j+=1;
return j-i-1;
def longestPalindrome(self, s: str) -> str:
len_s=len(s);
start,end,max_l=0,0,0;
for i in range(len_s):
以 i 为 中心 扩展
len1=self.getCenter(s,i,i);
以 i i+1 为中心扩展
len2=self.getCenter(s,i,i+1);
len3=max(len1,len2);
if max_l<len3:
记得 int 强转
start=i-int((len3-1)/2);
end=i+int(len3/2);
max_l=len3;
return s[start:end+1];
- 动态规划
优快云博客教程
超时了!思路!
def longestPalindrome(self, s: str) -> str:
import numpy as np
len_s=len(s);
dp=np.zeros((len_s,len_s),dtype=int);
max,start,end=0,0,0;
for i in range(len_s):
dp[i][i]=1;
for i in range(1,len_s):
for j in range(i-1,-1,-1):
if s[j]==s[i]:
if i-j==1:dp[j][i]=2;
elif dp[j+1][i-1]>0:dp[j][i]=dp[j+1][i-1]+2;
if dp[j][i]>max:
max,start,end=dp[j][i],j,i;
return s[start:end+1]
2.马拉车算法(Manacher‘s Algorithm)
算法链接
def trans(s,f):
g=''+f;
for i in s:
g+=i;
g+=f;
return g;
def center(sr,i,len):
step,k1,k2=0,i-1,i+1;
while k1>=0 and k2<len and sr[k1]==sr[k2]:
k1-=1;
k2+=1;
step+=1;
return step;
def long(s):
sr=trans(s,'#');
max_len=1;
le=len(sr)
for i in range(le):
p=center(sr,i,le);
if p>max_len:
max_len=p;
start=int((i-max_len)/2);
return s[start:start+max_len];
lp=long('adddfdddkkpo');
print(lp)
dddfddd