马拉车算法主要用于解决字符串中最长回文串的问题,回文串是指正着读反着读都一样的字符串(例如:aba)。
在解决这种问题时我们会发现回文串主要分为两种,一种是长度为偶数的(例如abba),一种是奇数的(例如aba),他们有着不同的对称中心,所以得分别处理,马拉车算法的精髓之处就在于把两种字符串都同一处理了,他在字符串每个字符前后都加上一个字符串中没有的字符(例如加入“#”,那么字符串就会变为“#a#b#b#a#”或者是“#a#b#a#”),这样无论是偶数的还是奇数的都会变为奇数的,这样可以同一处理。
我们通过添加字符得到了新的字符串,接下来就对新的字符串求解其最大回文串长度。
算法的主要目的就是求出以字符串中每个字符为中心的回文串的最大长度(由于加入“#”的缘故,回文串都变成了奇数,所以肯定是以一个字符为中心的),将其存放在数组P[]中。以“babad”为例:
当得出P[i]时,计算原始回文串(去除“#”的回文串)的长度就很简单了,即为P[i]-1,推倒如下:
在以i点为中点的回文长度为(2P[i]-1),半径为P[i]。设在其中的“#”有x个,其他字符有y个,则:
x + y = 2P[i] - 1
由于在每个字符前后都有一个“#”,显而易见“#”要比其他的字符多一个,则:
x-y=