该题要求一个字符串的最长回文子串长度,如果使用枚举法就是按照子串长度递减的顺序穷举每一个子串,并判断该子串是否是回文子串,如果是就输出子串长度结束。流程如下图
该做法共有n种长度的子串,每一种长度的子串数量是n,检查一个子串是否为回文子串需要对比n此,故总体时间复杂度是n^3。
以上做法存在的问题是判断新子串是否为回文子串时没有利用之前所求的结果,假设存在字符串n=aabaa,那么如果判断n[0,4]是否为回文就是判断 n[1,3]是否为回文&&n[0]==n[4]。
基于以上思想改进穷举法,使用i遍历数组n,将i位置和i与i+1之间的空隙位置分别作为对称中心,依次向左右两边扩散,找出以i位置或i与i+1之间的空隙位置为对称中心的最长回文串,进而找出最长回文串。过程简述如下
算法代码如下
line=input()
l=len(line)
max=0
for i in range(l):
##i位置对称
p=i
q=i
while line[p]==line[q]:
sub=q-p+1
if sub>max:
max=sub
if p-1>=0:
p=p-1
else:
break
if q+1<l:
q=q+1
else:
break
##i与i+1的中间位置对称,如果i是最后一个元素则没有i与i+1的中间位置,不用判断。
if i!=l-1:
p=i
q=i+1
while line[p]==line[q]:
sub=q-p+1
if sub>max:
max=sub
if p-1>=0:
p=p-1
else:
break
if q+1<l:
q=q+1
else:
break
print(max)