Python/strings/manacher.py
Christian Clauss bfcb95b297
Create codespell.yml (#1698)
* fixup! Format Python code with psf/black push

* Create codespell.yml

* fixup! Format Python code with psf/black push
2020-01-18 13:24:33 +01:00

58 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 incrementing 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 convert 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 i-th 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))