码迷,mamicode.com
首页 > 其他好文 > 详细

Manacher

时间:2020-09-14 19:04:06      阅读:39      评论:0      收藏:0      [点我收藏+]

标签:对比   return   append   pen   避免   开始   max   字符串   半径   

给定一个字符串 s,找到 s 中最长的回文子串。

public static String longestPalindrome(String s) {
        //最大长度
        int max=0;
        //最大长度的回文中心
        int mi=0;
        //加#避免漏虚轴
        char[] chars = addf(s);
        //对应chars上当前字符回文半径
        int[] pr=new int[chars.length];

        //当前最右能扩到的位置
        int r=0;
        //当前扩到最右位置的中心点
        int ri=0;


        for (int i = 0; i < chars.length; i++) {


            //从当前右边第几个开始扩
            int k=1;
            if (ri*2-i>=0&&r>=pr[ri*2-i]+i){
                k=pr[ri*2-i];
            }
            //对比回文串
            while ((i+k)<chars.length && i-k>=0){
                if (chars[i+k]==chars[i-k]){
                    k++;
                }else {
                    break;
                }
            }
            //更新最右值
            if (k+i-1>r){
                r=k+i-1;
                ri=i;
            }
            //记录当前位置半径
            pr[i]=k-1;
            //更新最大值
            int length=k*2-1;
            if (length>max){
                max=length;
                mi=i;
            }

        }
        //组织回文串
        StringBuilder re=new StringBuilder();
        int index=mi-(max-1)/2;
        for (int i = 0; i < max; i++) {
            if (chars[index]==‘#‘){
                index++;
                continue;
            }
            re.append(chars[index]);
            index++;
        }

        return re.toString();
    }


    public  static char[] addf(String s){

        char[] chars=new char[s.length()*2+1];

        for (int i = 0; i < s.length(); i++) {
            chars[2*i]=‘#‘;
            chars[2*i+1]=s.charAt(i);
        }
        chars[s.length()*2]=‘#‘;
        return chars;

    }

 

Manacher

标签:对比   return   append   pen   避免   开始   max   字符串   半径   

原文地址:https://www.cnblogs.com/macbk/p/13596382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!