当前位置: 首页 > 网络应用技术

Manacher算法

时间:2023-03-08 14:15:15 网络应用技术

  前言Manacher算法是一种算法,可以解决最长的后背,以在字符串中找到Wenzi最长的回报,而且很快!

  从位置0开始,暴力解决方案在每个位置作为中心点的左侧和右侧扩展,具体取决于可以扩展的位置!但是此方法仅适用于返回文本的长度。

  如果我是该怎么办?

  使用特殊字符处理源字符串处理,例如字符串“ 121AAAA232AA”

  在源字符串的起始和结束位置中添加一个特殊字符,并在每个两个字符之间插入特殊字符,然后从0位置开始,然后在每个位置向左和右侧扩展,作为中心点,以查看位置它可以扩展!获得结果后,2是最终结果。(除了2下取下)。

  如果您不使用特殊字符,源字符串中的任何字符都会影响结果吗?

  不会!因为源字符只能与源字符进行比较,因此只会将特殊字符与特殊字符进行比较。没有任何时间,将将源字符与特殊字符进行比较!

  暴力时间复杂性是最糟糕的例子:aaaaa,它变成处理后

  可以在每个位置扩大的距离为0、1、2、3、4、4、4、3、2、1和0。度数为O(n^2)。

  暴力解决的原因是暴力是可以扩大每个位置。Manacher算法是当前位置的结果,可以加速下一个位置的计算。因此,它与KMP的想法有点相似算法,因为每个位置计算得出的结果无法指导下一个位置。

  返回直径和后背半径,例如字符串

  ABC12321DEF

  Huiwen的直径为5,Huiwen的半径为3(半径不是直径的一半!!!)

  如果背弦的长度均匀,例如

  ABC1221DEF

  返回文本的直径为4,返回文本的半径为2

  如果处理的字符串:

  返回文本的直径为9,返回文本的半径为5

  根据处理后的处理字符串,从左到右的每个位置的长度是将每个位置的长度扩展到左侧和右侧。

  右手边界由R表示,并在开始时将其设置为-1。这意味着0个位置尚未开始扩展,因此右边界被认为在-1中。

  因此,右侧边框代表每个扩展的向后区域的最右边。

  如果在开始时将右侧边界的中心点C设置为-1。当更新右手边框时,C负责扩展中心点。C和r伴随着,r不会更新C。r更新C后,它将进行更新。

  Manacher算法工艺(O(n))Manacher算法过程与暴力解决方案的大过程相同。它在扩展时会加速。

  注意:Manacher仍然是已接受处理的源字符串!

  假设我目前在左右两侧的位置,毫无疑问,有两种情况:

  1.我目前没有被R所覆盖。它无法优化。它只能扩大暴力。它与左侧和右侧的字符不同。2。我被R覆盖,这种情况可以细分。

  r将扩展它,或者只是按下i,然后中心点C必须在i的左侧,因为它必须相对较远,然后再覆盖特定的中心点,然后才盖上我时间,您肯定可以对C,我和L.在特殊情况下提出一个对称的观点,我和r被重新排列,但也有上述对称性:有上述关系(我涵盖了我的情况r),以及随后的小情况分类。根据i的返回文本区域的扩展。我在左侧位置旁边,表明我以前已经扩展了,并且答复的半径是半径。

  1)例如,我完全在l..r.中扩展了后卫区域我可以扩展必须像我扩展的区域一样大!

  证明2)i'ran扩展到l外部L。

  证明3)例如:在这种情况下,i'的左边界和L的左边界和l至少在i的背面时,i'的返回文本的半径(本段不需要验证))但是它会更大吗?需要验证。

  Manacher时间的复杂性

  编码的详细信息

  完成代码

  本文来自:Manacher算法

  原始:https://juejin.cn/post/7102592480532496398