ABCBADEFEDAG
此算法最直观的方法是遍历法,复杂度为O(n^2)。
不过只需遍历一次,就可得到此串最长回文串,复杂度为O(n)。其算法具体如下:
初始每个字符为中心的最大回文串长度都是1,计为p[n] = 1,暂不考虑邻接对称的情况。对于考虑邻接对称的情况,应对策略是,在串中依次插入一个空格,求取新串回文串。
#include<iostream>
using namespace std;
int huiwen(char *s){
int maxn = 0, maxi = 0;
int mid = 1;
int n = strlen(s);
int *p = new int[n];
for (int i = 0; i < n; i++){
p[i] = 1;
}
for (int i = 2; i<n; i++){
if (2 * mid - i >= 0 && s[i] == s[2 * mid - i]){
p[mid]++;
if (p[mid>maxn]){
maxn = p[mid];
maxi = mid;
}
}
else {
mid = i;
}
}
cout << maxn << " " << maxi << endl;
delete[]p;
return 0;
}
void main(){
char s[] = "ABCBADEFEDAG";
huiwen(s);
}