对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串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);
}
}