我们现在要向右移动…
假设你的“当前”回文有40个字母(可能是以100号位置为中心的)。你想找一个更大的回文。
(好吧,可能会有一个900个字母长、距离这个回文右边50000个字母的更大的回文——完全与这个无关。没关系。但我们将来会提到它。现在,我们必须将中心移到右侧,同时寻找比40还要长的回文。有道理吗?)
所以我们必须向右移动——我们可以移动一步。但是我们希望尽可能地向右移动而不会漏掉任何一个。
现在,如果右侧的下一个回文要包括这个回文……实际上,它必须包括这组40个字母的最右边的字母。(它不能再往左了,因为我们已经检查过了,所以它必须位于100之后,并且因为它将比40更长,所以它必须包括我们右手边的字母,#120。)
那么我们需要往回走多远呢?
嗯,你不能往回走(从120)比一个回文还要远!如果中间不是回文,它永远也不会成为回文。
3333333333333331110111
你只能“回到”0。例如,留在0左侧的1永远不能成为回文。
所以很简单。你必须包括我们最右边的字母(如果我们要包括任何人),而且你希望它尽可能大,它必须是回文,因为回文只能以回文为中心开始(我指的是“从中间”)。
在上面的例子中,左侧的1或0,或者说最右侧的3,在无论右侧有什么东西时都永远不能成为回文中心。它们周围没有回文,所以它们永远不能成为回文中心!
请注意,三个3中间的那个3可能会成为更大的回文中心……但别忘了,我们已经检查过这是到目前为止最长的回文(基于中心点,从左边算),所以这不可能是真的。
因此,任何比这个更长的回文——换句话说,下一个可能的比这个更长的回文的起点——就是0。
换句话说,它只是我们当前在右侧具有的最大回文字符串的中心。(因此,不是“111”这个短的回文字符串,而是“1110111”,它是您在右侧看到的最长回文字符串。)