Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Speedy category for The Longest Palindromic by lezeroq
def longest_palindromic(text):
"""
Use Manacher's algorithm
"""
data = "|%s|" % ("|".join(text))
right, center = 0, 0
m, n = 0, 0
d_len = len(data)
length = [0] * d_len
for i in range(d_len):
len_i = max(1, min(length[2 * center - i], right - i))
while (
len_i <= i and len_i < d_len - i
and data[i - len_i] == data[i + len_i]
):
len_i += 1
if right < len_i + i:
right = len_i + i
center = i
if right - center > n - m:
m, n = center, right
length[i] = len_i
return "".join([x for i, x in enumerate(data[2 * m - n + 1:n]) if i % 2])
if __name__ == '__main__':
assert longest_palindromic("artrartrt") == "rtrartr", "The Longest"
assert longest_palindromic("abacada") == "aba", "The First"
assert longest_palindromic("aaaa") == "aaaa", "The A"
March 2, 2016
Comments: