最长回文子串(Manacher算法)

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

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

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

你可能感兴趣的:(笔试题)