Manacher算法(最大回文子串)

推荐大家一个视频。http://www.bilibili.com/video/av4829276/index_1.html。讲manacher算法的。看了好几个博文都不太理解,最后搜了一下视频。很有帮助。

package study.lei.string;

import java.util.Scanner;

public class Manacher {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        String inStr = in.nextLine();
        manacher(inStr);

    }

    public static void manacher (String str){

        char [] cStr = str.toCharArray();
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("#");
        for (int i = 0; i < cStr.length; i++) {
            sBuffer.append(cStr[i]);
            sBuffer.append("#");
        }

        int id =0;
        int max = 0;
        int p[]= new int[sBuffer.length()];
        for (int i = 1; i < sBuffer.length(); i++) {

            if (i<max) {
                p[i] = Math.min(p[2*id-i], max-i);
            }else {
                p[i]= 1;
            }
            while (i-p[i]>=0&&i+p[i]<sBuffer.length()&&sBuffer.charAt(i-p[i])==sBuffer.charAt(i+p[i])) {
                p[i]++;
            }
            if (i+p[i]>max) {
                max = i+p[i];
                id = i; 
            }
        }

        int maxl = 0 ;
        int maxid =0 ;
        for(int i =0 ;i<p.length;i++){
            if(maxl<p[i]){
                maxl=p[i];
                maxid = i;
            }


        //半径包括id本身。id到第一个元素,id-r+1
        int r = maxl-1;
        int start = maxid-r+1;
        int end = maxid+maxl-1;
        StringBuffer out = new StringBuffer();
        for (int i = start; i < end; i++) {
            if (sBuffer.charAt(i)!='#') {
                out.append(sBuffer.charAt(i));
            }
        }

        System.out.println("最大回文子串长度:"+ (maxl-1)+"\n内容为:"+out.toString());
    }

}

这里写图片描述

ps:今天看了一早上,还是没怎么懂。。。

推荐给大家一篇讲解Manacher的博客 https://blog.csdn.net/dyx404514/article/details/42061017

转载自:https://blog.csdn.net/w5761499123/article/details/61420768

猜你喜欢

转载自blog.csdn.net/weixin_41126303/article/details/82659514