您的位置:首页 > 编程语言 > Java开发

最长回文子串(Manacher算法)

2017-09-04 23:03 603 查看
给定一个字符串,求它的最长回文子串的长度。

有的博客给出了四种解法

基本思路就请参考其他博客的介绍,在这里主要是分享一个我找了很久的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
;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java编程题