Manacher(马拉车)算法求最长回文子串

本文介绍了马拉车(Manacher)算法,用于高效地找到字符串中最长的回文子串。文章详细阐述了算法思路,包括在字符串中插入特殊字符以处理偶数长度回文,以及如何利用已知回文边界快速确定当前位置的回文半径。同时,文章提供了算法的伪代码和Java实现。
摘要由CSDN通过智能技术生成

需要用的变量1:每一个位置的最长回文半径
需要用的变量2:之前扩的所有位置中,所能到达的最右 回文右边界
需要用的变量3:取得最远右边界时候中心点的位置
一、思路
(一)将数组每个位置中间加上#,这样可以判断偶数长度字符串的回文
在这里插入图片描述

(二)先设置一个数组,记录每个位置的回文半径
1.情况1,当前位置i没有在变量2里面。直接暴力往左边两边找最大回文串
2.情况2,当前位置i在变量2内部,则变量3一定也在i左边,当前位置i对变量3做对称。L是变量3的左边界,如图情况:
在这里插入图片描述

再根据情况2.中i的回文情况再分为以下几种情况:
(1)i’的回文半径在L到R内部(情况入下图所示),那么i的半径就和i’半径一样
在这里插入图片描述

(2)i’的回文半径在LR外部,那么i的回文半径就是i到R这一段。
在这里插入图片描述

(3)i’的回文半径左侧正好在L位置上,i的半径长度未知,得继续向右扩才能找到最大半径。

在这里插入图片描述

二、伪代码
在这里插入图片描述

三、java代码

public String preProcess(String s) {
   
    int n = s.length();
    if (n == 0) {
   
        return "^$";
    }
    String ret = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值