输入一个字符串,输出其最长回文字符串的长度和其最长回文字符串,如有多个长度相等的最长回文子串,则都输出。 例如 输入:abcdcada 输出:3 cdc ada 被难了好多天了,搞了一坨出来,求大佬帮帮
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[101];//输入的字符串
int i;//a[i]
for (i = 0; i < 101; i++)
{
a[i] = '\0';
}//定义并初始化初始字符串
scanf("%s", a);//输入初始字符串
int lena;
lena = strlen(a);//求出a的最大长度防止越界
int j;//a[i+-j]字符串中“移动”所需的变量
int maxlen=2;//最长回文串的长度,2为不可取到的最小值
int thislen=0;//某一字串的长度
int huis[40] = {0};//存储找到的回文字串的首位数的位置i
int huislen[40] = {0};//存储找到的回文字串的长度
int u=0;//huis[u],huislen[u]
//寻找奇数回文子串
for (i = 2; a[i+2] != '\0'; i++)
{
for (j = 1; (i - j) >= 0 && (i + j) < lena; j++)
{
thislen = 1;
if (a[i - j] == a[i + j])//左右对称,回文
{
thislen=thislen + 2;//左右各加一个长度
}
if (thislen > 1)//说明找到了回文串
{
huis[u] = i - j;//存储该回文首位的位置
huislen[u] = thislen;//该回文串的长度
u++;
}
}
}
//寻找偶数最长回文子串
for (i = 2; a[i + 2] != '\0'; i++)
{
for (j = 1; (i - j) >= 0 && (i + j + 1) > lena; j++)
{
thislen = 2;
if (a[i - j] == a[i + j + 1])
{
thislen =thislen+ 2;
}
if (thislen > 3)
{
huis[u] = i - j;
huislen[u] = thislen;
u++;
}
}
}
for (u = 0; u < 40; u++)
{
if (huislen[u] > maxlen)
{
maxlen = huislen[u];
}
}//找出最大长度
if (maxlen > 2)
{
printf("%d\n", maxlen);//先输出最大长度
for (u = 0; u < 40; u++)
{
if (huislen[u] = maxlen)//如果回文字串长度和最大值相等
{
for (j = 0; j < huislen[u]; j++)
{
printf("%c", a[huis[u] + j]);//输出该字串
}
printf(" ");
}
}
}
return 0;
}