Манакера алгоритм (алгоритм, чтобы найти самый длинный палиндром подстроки в линейном времени)



потратив около 6-8 часов, пытаясь переварить алгоритм Манакера, я готов бросить в полотенце. Но прежде чем я это сделаю, вот последний выстрел в темноте: может ли кто-нибудь объяснить это? Мне плевать на код. Я хочу, чтобы кто-нибудь объяснил алгоритм.



здесь, кажется, есть место, которое другие, казалось бы, нравится в объяснении алгоритма:
http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html



I поймите, почему вы хотите преобразовать строку, скажем, 'abba' в #a#b#b#a#
После чего я теряюсь. Например, автор ранее упомянутого сайта говорит, что ключевой частью алгоритма является:



                      if P[ i' ] ≤ R – i,
then P[ i ] ← P[ i' ]
else P[ i ] ≥ P[ i' ]. (Which we have to expand past
the right edge (R) to find P[ i ])


это кажется неправильным, потому что он/она говорит в какой - то момент, что P[i] равно 5, когда P[i'] = 7 и P[i] не меньше или равно R-i.



Если вы не знакомы с алгоритмом, вот еще несколько ссылок: http://tristan-interview.blogspot.com/2011/11/longest-palindrome-substring-manachers.html (я пробовал это, но терминология ужасная и запутанная. Во-первых, некоторые вещи не определены. Кроме того, слишком много переменных. Вам нужен контрольный список, чтобы вспомнить, какая переменная относится к чему.)



другой:http://www.akalin.cx/longest-palindrome-linear-time (удачи)



основная суть алгоритма заключается в том, чтобы найти самый длинный палиндром в линейное время. Это может быть сделано в O(n^2) с минимальным и средним количеством усилий. Этот алгоритм должен быть довольно "умным", чтобы свести его к O(n).

656   0  

Comments

    Ничего не найдено.