1:中心扩展法
int LongestPalindrome(const char *s, int n)
{
int i,j,max,c;
if (s == 0 || n < 1)
{
return 0;
}
max = 0;
// i为回文的中心位置
for (i = 0; i < n; ++i)
{
// 回文长度为奇数
for (j = 0; (i - j >= 0) && (i + j < n); ++j)
{
if (s[i - j] != s[i + j])
{
break;
}
c = j * 2 + 1;
}
if (c > max)
{
max = c;
}
// 回文长度为偶数
for (j = 0; (i - j >= 0) && (i + j + 1 < n); ++j)
{
if (s[i - j] != s[i + j + 1])
{
break;
}
c = j * 2 + 2;
}
if (c > max)
{
max = c;
}
}
return max;
}
2:Manacher算法
void Manacher()
{
int i;
int mx = 0;
int id;
for (i = 1; i < n; i++)
{
// mx > i时,P[i] >= Min(P[2 * id - i], mx - i)
if (mx > i)
{
p[i] = MIN(p[2*id - i], mx - i);
}
else
{
// mx <= i时,无法对p[i]做更多的假设,直接让p[i] = 1
p[i] = 1;
}
while (s[i + p[i]] == s[i - p[i]])
{
p[i]++;
}
if (p[i] + i > mx)
{
mx = p[i] + i;
id = i;
}
}
}