1.暴力枚举就是确定边界【i,j】两个for循环遍历范围,一个while循环进行遍历判断,复杂度O(n^3),过不了时间限制。
2.动态规划解决复杂度O(n^2)
s="aba"
dp = [[0] * len(s) for i in range(len(s))]
maxlen = 0
maxi = 0
maxj = 0
for j in range(len(s)):
for i in range(j + 1):
dp[i][j] = (s[i] == s[j]) and (j - i < 3 or dp[i + 1][j - 1])
if (dp[i][j] and j - i + 1 > maxlen):
maxlen = j - i + 1
maxi = i
maxj = j
print(s[maxi:maxj + 1])
3.中心扩散法O(n^2)
def middle(i,j,s):
m1=i
m2=j
while(m1>=0 and m2<len(s) and s[m1]==s[m2]):
m1-=1
m2+=1
return m1+1,m2-1
s="abacd"
maxlen=0
maxi=0
maxj=0
for i in range(len(s)):
x1,x2=middle(i,i,s)
if(x2-x1+1>maxlen):
maxlen=x2-x1+1
maxi=x1
maxj=x2
for i in range(len(s)-1):
x1,x2=middle(i,i+1,s)
if(x2-x1+1>maxlen):
maxlen=x2-x1+1
maxi=x1
maxj=x2
print(s[maxi:maxj+1])
本文介绍了三种不同的算法来寻找字符串中的最长回文子串:暴力枚举、动态规划及中心扩散法。其中,动态规划和中心扩散法的时间复杂度为O(n^2),能够有效地解决问题。文章通过具体示例展示了每种方法的实现过程。
&spm=1001.2101.3001.5002&articleId=122469584&d=1&t=3&u=a63ad062900b4a31b7843b267fefdf18)
331

被折叠的 条评论
为什么被折叠?



