题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
“abc1234321ab”,12
返回:7
思路:manacher算法(PS:强烈推荐左程云的视频,讲的非常清楚
牛客网视频manacher算法地址)
class Palindrome {
public:
//pArr为回文半径数组
int pArr[1005];
int getLongestPalindrome(string A, int n) {
// write code here
if(n==0) return 0;
string B="#";
for(int i=0;i<n;i++){
B.append(1,A[i]);
B.append(1,'#');
}
int m=2*n+1;
/*
pR为当前回文半径所能到达的最右位置,index为pR所对应的回文中心位置
*/
int pR=-1,index=-1,Max=0;
for(int i=0;i<m;i++){
pArr[i]=pR>i?min(pR-i,pArr[2*index-i]):1;
while(i>=pArr[i]&&pArr[i]+i<m){
if(B[pArr[i]+i]==B[i-pArr[i]]){
pArr[i]++;
}
else{
break;
}
}
if(i+pArr[i]>pR){
pR=i+pArr[i];
index=i;
}
Max=max(pArr[i],Max);
}
return Max-1;
}
};