看了好多文章终于看明白了“马拉车算法”,具体内容转自:https://segmentfault.com/a/1190000003914228
本文对其进行了小修改,返回最长回文子串,以及字符串的长度(leetcode的第5题:https://leetcode-cn.com/problems/longest-palindromic-substring)
# coding:utf-8
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
pos = 0
maxright = 0
max_len = 0
s = "#" + "#".join(s) + "#"
s_num = [0] * len(s)
res =""
max_i = 0
for i in range(len(s)):
if i < maxright:
s_num[i] = min(s_num[2 * pos - i], maxright - i)
else:
s_num[i] = 1
while i - s_num[i] >= 0 and i + s_num[i] < len(s) and s[i - s_num[i]] == s[i + s_num[i]]:
s_num[i] += 1
if i + s_num[i] -1 >maxright:
maxright = i + s_num[i] -1
pos = i
max_len = max(max_len,s_num[i] )
if max_len == s_num[i]:
max_i = i
max_len -=1
tem = s[max_i-max_len:max_i+max_len+1]
for i in tem:
if i!="#":
res +=i
return res,max_len