您的位置:首页 > 编程语言 > Java开发

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

2015-10-25 18:09 399 查看
最长回文子串

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

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

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: