Проведя около 6-8 часов, пытаясь переварить алгоритм Манахера, я готов бросить полотенце. Но прежде чем я это сделаю, вот последний выстрел в темноте: кто-нибудь может это объяснить? Меня не интересует код. Я хочу, чтобы кто-то объяснил ALGORITHM.
Здесь, похоже, место, которое другим, казалось, понравилось в объяснении алгоритма: http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
Я понимаю, почему вы хотите преобразовать строку, скажем, '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).