1. 程式人生 > >Manacher演算法------求最長迴文子串(Java)

Manacher演算法------求最長迴文子串(Java)

最長迴文子串

對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。

給定字串A以及它的長度n,請返回最長迴文子串的長度。

測試樣例:
"abc1234321ab",12
返回:7

public class Main {
     public static void main(String[] args) {
         Main test = new Main();
         System.out.println(test.getLongestPalindrome("cdbdbbdabaaaaabaca",18));
     }
     public int getLongestPalindrome(String A, int n) {
        if(A==null){
            return 0;
        }
        int k=0;
        int right=0;
        int index=0;
        int len=2*n+1;
        int max=Integer.MIN_VALUE;
        char[] Acopy=new char[len];
        char[] a=A.toCharArray();
        int [] arr=new int[len];
        for(int j=0;j<len;j++){
            Acopy[j]=(j&1)==0?'#':a[k++];
        }
        for(int i=1;i<len-1&&right<len-1;i++){
         arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
            while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
             arr[i]++;
            }
            if(i+arr[i]>right){
                right=i+arr[i]-1;
                index=i;  
            }

            max=Math.max(arr[i],max);
        }
        return max-1;
    }
}

添加回文串

對於一個字串,我們想通過新增字元的方式使得新的字串整體變成迴文串,但是隻能在原串的結尾新增字元,請返回在結尾新增的最短字串。

給定原字串A及它的長度n,請返回新增的字串。保證原串不是迴文串。

測試樣例:
"ab",2
返回:"a"

public class Main {
 public static void main(String[] args) {
  Main test = new Main();
     System.out.println(test.addToPalindrome("abbbbbaa",8));
 }
    public String addToPalindrome(String A, int n) {
        if(A==null){
            return null;
        }
        int k=0;
        int right=0;
        int index=0;
        int len=2*n+1;
        char[] Acopy=new char[len];
        char[] a=A.toCharArray();
        int [] arr=new int[len];
        for(int j=0;j<len;j++){
            Acopy[j]=(j&1)==0?'#':a[k++];
        }
        int i;
        for(i=1;i<len-1&&right<len-1;i++){
         arr[i]=i<right?Math.min(right-i+1, arr[2*index-i]):1;
            while((i+arr[i])<len&&(i-arr[i])>=0&&Acopy[i-arr[i]]==Acopy[i+arr[i]]){
             arr[i]++;
            }
            if(i+arr[i]>right){
                right=i+arr[i]-1;
                index=i;  
            }
        }
        char[] temp=new char[n-arr[i-1]+1];
        int start=0,end=n-arr[i-1];
        for(int j=0;j<=n-arr[i-1];j++){
            temp[j]=a[n-arr[i-1]-j];
        }
         return String.valueOf(temp);
    }
}