【LeetCode】5. Longest Palindromic Substring 最大回文子串

题目:

  Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

思路:用Manacher算法得到最大回文子串的长度,得到带#的最大回文子串,用split剔除#后转化成String形式输出即可。

public class Solution {
    public String longestPalindrome(String s) {
        if(s==null || s.length()==0){
            return null;
        }
        char[] charArr=manacherString(s);
        int[] pArr=new int[charArr.length];
        
        int index=-1;
        int center=-1;
        int pR=-1;
        int max=0;
        for(int i=0;i<charArr.length;i++){
            pArr[i]=pR>i?Math.min(pArr[2*index-i],pR-i):1;
            
            while(i+pArr[i]<charArr.length && i-pArr[i]>-1){
                if(charArr[i+pArr[i]]==charArr[i-pArr[i]]){
                    pArr[i]++;
                }else{
                    break;
                }
            }
            if(i+pArr[i]>pR){
                pR=i+pArr[i];
                index=i;
            }
            
            if(pArr[i]-1>max){
                max=pArr[i]-1;//得到最大回文子串的长度
                center=i;
            }
        }
        //以string形式返回最大回文子串
         String str=new String(charArr);
         String[] strArr=str.substring(center-max,center+max).split("#");
         StringBuffer sb=new StringBuffer();
         for(int i=0;i<strArr.length;i++){
             sb.append(strArr[i]);
         }
        return sb.toString();
    }
    
    public static char[] manacherString(String str){
        char[] charArr=str.toCharArray();
        char[] res=new char[2*str.length()+1];
        int index=0;
        for(int i=0;i!=res.length;i++){
            res[i]=(i&1)==0?'#':charArr[index++];
        }
        return res;
    }
}

  

posted on 2016-10-24 19:07  一只笨笨鸟  阅读(138)  评论(0编辑  收藏  举报