最长回文子串(Manacher算法)

给定一个字符串,求它的最长回文子串的长度。
有的博客给出了四种解法

基本思路就请参考其他博客的介绍,在这里主要是分享一个我找了很久的BUG。
BUG:数组越界
找呀找,找到有以下几点原因:

  • 没有对原始字符串增加‘¥’,‘#’,末尾也要加一个‘#’;
  • 在for循环里面,i=1,但是最开始我写成i=0;
  • for循环与while循环,每次改变 i 与 p[i]的值后,没有进行判断,导致while里的语句出现数组越界问题。
  • 很重要的一点就是注意循环起点,与终点情况;
  • 下面是修改后,增加的两个if 判断,解决数组越界问题。
if(i+p[i]<n){
    while(...){
    if(i+p[i]>=n){
          break;
      }
    }
  } 
import java.util.Arrays;

/**
 * Created by user on 2017/9/4.
 */
public class MyFunction {
    public static void main(String[] args){
        int[] arr={'$','#',1,'#',2,'#',2,'#',1,'#',2,'#',3,'#',2,'#',1,'#'};
        int n =arr.length;
        System.out.println(getMaxHuiwen(arr,n));
    }
    public static int getMaxHuiwen(int[] arr,int n){
        int[] p = new int[n];
        int mx = 0;
        int id =0;
        for(int i=1 ;i<n-1;i++){
            p[i] = (mx>i) ? Math.min(p[2*id-i],mx-i):1;
            if(i+p[i]<n){
                while (arr[i+p[i]]==arr[i-p[i]]){
                    p[i]++;
                    if(i+p[i]>=n){
                        break;
                    }
                }
            }
            if(i+p[i]>mx){
                mx = i+p[i];
                id = i;
            }
        }
        Arrays.sort(p);
        return p[p.length-1]-1;
    }
}

运行结果:

5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值