来源https://www.cnblogs.com/cloudplankroader/p/10988844.html
思路:chaArr避免奇偶讨论(chaArr[i] = (i & 1) == 0 ? '#' : str[index++]; 偶赋值#,奇遍历),
pArr记录半径(多出来了1),R为最右端(i超出了R重新讨论,半径赋值1),C为中心
注意:开始讨论空字符串,最后清空两个数组
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int maxLcsplength(string str) {
if (str.length() == 0) {
return 0;
}
int len = (int)(str.length() * 2 + 1);
char *chaArr = new char[len];
int* pArr = new int[len];
int index = 0;
for (int i = 0; i < len; i++) {
chaArr[i] = (i & 1) == 0 ? '#' : str[index++];
}
int R = -1;
int C = -1;
int maxn = 0;
for (int i = 0; i < len; i++) {
pArr[i] = R > i ? min(R - i, pArr[2 * C - i]) : 1;
while (i + pArr[i] < len && i - pArr[i] > -1) {
if (chaArr[i + pArr[i]] == chaArr[i - pArr[i]]) {
pArr[i]++;
} else {
break;
}
}
if (i + pArr[i] > R) {
R = i + pArr[i];
C = i;
}
maxn = max(maxn, pArr[i]);
}
delete[] chaArr;
delete[] pArr;
return maxn - 1;
}
int main()
{
string s1 = "";
cout << maxLcsplength(s1) << endl;
string s2 = "abbbca";
cout << maxLcsplength(s2) << endl;
return 0;
}