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);
}
}