题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
"abc1234321ab",12
返回:7
解题思路
法一:中心扩散法( 时间复杂度O(n^2),空间复杂度O(n) )
-> 遍历每个字符,以该字符为中心,向前、后扩散,直到不满足回文时停下。
法二:动态规划法( 时间复杂度O(n^2),空间复杂度O(n^2) )
-> 待续
法三:Manacher算法( 时间复杂度O(n) )
-> 待续
中心扩散法代码:
class Palindrome {
public:
int getLongestPalindrome(string A, int n) {
int maxLen = 0, tempLen;
for(int i = 0; i < n; ++i){
tempLen = 1;
int l = i-1, r = i+1;
//单独统计中心长度,因为有...ABBA...和...ABA...两种情况
while(l >= 0 && A[l] == A[i]){
++tempLen;
--l;
}
while(r < n && A[r] == A[i]){
++tempLen;
++r;
}
//前后同时扩散
while(l >= 0 && r < n){
if(A[l] == A[r]){
tempLen += 2;
--l;
++r;
}else{
break;
}
}
maxLen = tempLen > maxLen ? tempLen : maxLen;
}
return maxLen;
}
};