【题目】
给定一个字符串str,返回str中最长回文子串的长度。要求时间复杂度O(N)。
【进阶题目】
给定一个字符串str,想通过添加字符的方式使得str整体都变成回文字符串,但要求只能在str的末尾添加字符,请返回在str后面添加的最短字符串。要求时间复杂度O(n)。
【代码实现】
#python3.5
#原问题
def manacherString(string):
res = [0 for i in range(len(string) * 2 + 1)]
index = 0
for i in range(len(res)):
if i & 1 == 0:
res[i] = "#"
else:
res[i] = string[index]
index += 1
return res
def maxLcpsLength(str1):
if str1 == None or len(str1) == 0:
return 0
mStr = manacherString(str1)
help = [0 for i in range(len(mStr))]
index = -1
right = -1
maxLen = 0
for i in range(len(mStr)):
if right > i:
help[i] = min(right - i, 2 * index - i)
else:
help[i] = 1
while i + help[i] < len(mStr) and i - help[i] > -1:
if mStr[i+help[i]] == mStr[i-help[i]]:
help[i] += 1
else:
break
if i + help[i] > right:
right = i + help[i]
index = i
maxLen = max(maxLen, help[i])
return maxLen - 1
#进阶题目
def shortestEnd(str1):
if str1 == None or len(str1) == 0:
return 0
mStr = manacherString(str1)
help = [0 for i in range(len(mStr))]
index = -1
right = -1
maxLen = 0
maxContainsEnd = 0
for i in range(len(mStr)):
if right > i:
help[i] = min(right-i, help[2*index-i])
else:
help[i] = 1
while i + help[i] < len(mStr) and i - help[i] > -1:
if mStr[i+help[i]] == mStr[i-help[i]]:
help[i] += 1
else:
break
if i + help[i] > right:
right = i + help[i]
index = i
if right == len(mStr):
maxContainsEnd = help[i]
break
res = []
for i in range(len(str1)-maxContainsEnd+1):
res.append(str1[i])
return ''.join(res[::-1])