在花了大约 6-8 小时试图消化 Manacher 的算法之后,我准备认输。但在我这样做之前,这是黑暗中的最后一枪:谁能解释一下?我不关心代码。我希望有人解释算法。
这里似乎是其他人似乎喜欢解释算法的地方: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'] = 7 并且 P[i] 不小于或等于 R - i 时 P[i] 等于 5。
如果您不熟悉该算法,这里还有一些链接: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)。