我花了大约6-8个小时来理解Manacher算法,但现在我准备放弃了。但在我放弃前,最后一次尝试,有人能解释一下吗?我不关心代码,我想要有人解释算法。
这里似乎是其他人很喜欢用来解释算法的地方:http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
我明白为什么你想要将字符串转换成例如 '#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)。