求最长回文子串最有效率的算法是manacher算法,时间复杂度为 O(n) ,空间复杂度同样是 O(n)
具体算法过程参考其他博文,这里只贴一下我自己实现的Python代码。遗憾地是,hihocoder的提交显示为TLE,运行超时,而我的代码在demo数据中表现正常,可能是Python的效率问题吧。
def longestPalindrome(str):
answer = 0
l = len(str)
if l <= 1:
return str
res = preProcess(str)
n = len(res)
p = [0]*n
id, mx = 0, 0
for i in range(1, n-1):
j = 2*id - i
p[i] = min(mx - i, p[j]) if mx > i else 1
while i-p[i] >= 0 and i+p[i] <= n-1 and res[i-p[i]] == res[i+p[i]]:
p[i] += 1
if i+p[i] > mx:
mx = i + p[i]
id = i
if p[i] > answer:
answer = p[i]
return answer - 1
def preProcess(str):
string = '#'
string += '#'.join(str)
string += '#'
return string
numCases = int(raw_input())
for i in range(numCases):
print longestPalindrome(raw_input())