马拉车算法(Manacher's Algorithm)

    public static void reserver(String s){
        StringBuffer sb=new StringBuffer();
        sb.append("$#");
        for (int i=0;i<s.length();i++){
            sb.append(s.charAt(i));
            sb.append('#');
        }
        char[] ca=sb.toString().toCharArray();
        int[] tag=new int[ca.length];
        int mid=0,right=0;
        int len=0,index=0;
        for (int i=1;i<ca.length;i++){
            tag[i]=i<right?Math.min(tag[2*mid-i],right-i):1;
            while (tag[i]+i<ca.length&&ca[tag[i]+i]==ca[i-tag[i]]){
                tag[i]++;
            }
            if (tag[i]+i>right){
                right=tag[i]+i;
                mid=i;
            }
            if (tag[i]>len){
                len=tag[i];
                index=i;
            }
        }
        System.out.println("最长回文子串:"+String.valueOf(s.toCharArray(),(index-len)/2,len-1));

   }

posted @ 2019-10-16 10:41  你还未发现  阅读(158)  评论(0编辑  收藏  举报