给定一个字符串,求它的最长回文子串的长度。
有的博客给出了四种解法
基本思路就请参考其他博客的介绍,在这里主要是分享一个我找了很久的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