最长回文子串

看了刘汝佳的白书,才发觉最长回文子串不是那么难,关键是将思路转化为代码;

之前看到一种通过在两个元素之间加入分隔符的方法,将奇偶情况统一起来,其实并没有减少运算量,感觉没直接的好,虽然代码长点,但是思路清晰;

另外学习了如何使用 fgets() 以及为什么不推荐使用 gets() 。

# include <stdio.h>
# include <string.h>
# include <ctype.h>

# define MAXN 1000

char ch[MAXN], s[MAXN];

int main()
{
int len, i, j, max, sta, end;

freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);

while (fgets(ch, MAXN, stdin) != NULL)
{
max = 0;
len = strlen(ch);
for (i = 0; i < len; ++i)
s[i] = toupper(ch[i]);
s[i] = '\0';
for (i = 0; i < len; ++i)
{
for (j = 0; i-j >= 0 && i+j < len; ++j)
{
if (s[i-j] != s[i+j]) break;
}
--j;
if (2*j+1 > max)
{
max = 2*j + 1;
sta = i - j;
end = i + j;
}
for (j = 0; i-j>=0 && i+j+1 < len; ++j)
{
if (s[i-j] != s[i+1+j]) break;
}
--j;
if (2*j > max)
{
max = 2 * j;
sta = i - j;
end = i + 1 + j;
}
}
printf("%d ", max);
for (i = sta; i <= end; ++i)
printf("%c", ch[i]);
printf("\n");
}

return 0;
}

最后,感觉奇偶情况分别讨论有冗余的地方,还要找更好的算法。

原文地址:https://www.cnblogs.com/JMDWQ/p/2392449.html