如何在最长的回文算法中选择下一个中心?

时间:2010-12-09 09:00:37

标签: algorithm palindrome

这是关于前一段时间讨论的longest palindrome algorithm的问题。解释算法的引用blog post说:“选择下一个中心,取当前回文的最长回文正确后缀的中心”。不幸的是,他们没有提供证据,我真的不明白为什么下一个中心是当前回文的最长回文正确后缀的中心

有人可以证明/解释吗?

1 个答案:

答案 0 :(得分:5)

所以我们向右移动......

说你的“当前”回文是40个大字母。 (也许以位置100为中心。)你正在努力寻找更大的一个。

(好吧,可能会有一个更大的900字母长,那是右边的50,000个字母 - 完全没有涉及到这个。这很好。但是我们将来会谈到这个。现在,我们必须将中心向右移动,同时寻找长于40个的回文。有道理吗?)

所以我们必须向右移动 - 我们可以迈出一步。但是我们希望尽可能地移动而不会遗漏任何内容。

现在,如果右边的下一个要包含这个...事实上, 它必须包含此组的最右边的字母 40.(它不能再向左,因为我们已经检查过,因此,它必须在100之后居中,并且,因为它将 长于40 < / strong>,它必须 包含我们的右手信 ,#120。)

那么我们还有多远呢?

嗯,你不能回到(从120) 比回文 !如果它不是中间的回文,它永远不会是回文。

3333333333333331110111

你只能“回”到0,坐在0左边的1(例如),永远不会是回文。

就这么简单。 你必须包含我们最正确的信件 (如果我们要包括我们中的任何人),并且你希望它尽可能大, 并且它必须是回文,因为回文只能从回文中开始(我的意思是“从中间”)

在上面的例子中,无论我们后来在右边找到什么,左边的1或者0,或者说最右边的3,都不可能在这个宇宙中心的一个回文中。他们周围没有回文,所以他们“永远不会”成为回文中心!

请注意,3s中间的3可能会占据更大的回文.... 但是 不要忘记我们已经检查过这是到目前为止最长的回文(基于中心,从左边开始),所以这不可能是真的。

所以任何比这个更长的回文 - 相比,下一个可能比这个更长的回文的起点 - 是0。

换句话说,它只是我们目前在右边最大的回文的中心。 (所以,不是“111”,这是一个回文而是短暂的,但是“1110111”是你能看到的最长的回文卡在右边。)

实际上,我们必须检查的两种可能性是(A)“0”和(B)倒数第二位的“1”。当然,在这两种可能性中,我们必须从左到右,所以(A)“0”确实是下一个要检查的。

不要忘记那两个(有问题的0和1)相当于说“末尾有一个回文1110111,并且末尾有一个较短的回文111”。

当然1110111更长,因此1110111的中心显然位于111中心的左侧。

最长的回文粘在右边,当然会让中心最靠近左边。

所以希望这清楚地说明了链接博客上讨论的具体部分,你问过!!!我故意以多种方式重复自己,希望它有所帮助。这是Jungian算法日:)

请再次注意我是专门的,只是想澄清迈克尔询问的非常具体的问题。

血腥混淆呃?

顺便说一句,我只是忽略了角色中角色中心的问题 - 但这与理解你所询问的内容无关。