Python/strings/manacher.py
Jitendra_Sharma f4806eb48c manacher's algorithm to find palindromic string (#676)
manacher's algorithm to find palindromic string in linear time complexity
2019-01-02 19:17:56 +08:00

53 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# calculate palindromic length from center with incresmenting difference
def palindromic_length( center, diff, string):
if center-diff == -1 or center+diff == len(string) or string[center-diff] != string[center+diff] :
return 0
return 1 + palindromic_length(center, diff+1, string)
def palindromic_string( input_string ):
"""
Manachers algorithm which finds Longest Palindromic Substring in linear time.
1. first this conver input_string("xyx") into new_string("x|y|x") where odd positions are actual input
characters.
2. for each character in new_string it find corresponding length and store,
a. max_length
b. max_length's center
3. return output_string from center - max_length to center + max_length and remove all "|"
"""
max_length = 0
# if input_string is "aba" than new_input_string become "a|b|a"
new_input_string = ""
output_string = ""
# append each character + "|" in new_string for range(0, length-1)
for i in input_string[:len(input_string)-1] :
new_input_string += i + "|"
#append last character
new_input_string += input_string[-1]
# for each character in new_string find corresponding palindromic string
for i in range(len(new_input_string)) :
# get palindromic length from ith position
length = palindromic_length(i, 1, new_input_string)
# update max_length and start position
if max_length < length :
max_length = length
start = i
#create that string
for i in new_input_string[start-max_length:start+max_length+1] :
if i != "|":
output_string += i
return output_string
if __name__ == '__main__':
n = input()
print(palindromic_string(n))