Manacher算法------求最长回文子串(Java)

博客介绍了如何利用Manacher算法高效地找到给定字符串中的最长回文子串,并提供了Java实现。此外,还讨论了如何在字符串末尾添加最少的字符,使整个字符串变成回文串的方法。文章包含两个主要方法的详细代码解释。
摘要由CSDN通过智能技术生成
最长回文子串

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值