输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000
————————————————
版权声明:本文为CSDN博主「malloc_88」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45486992/article/details/123135651
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void un(char s[])//统一字符串
{
for(int i=0;i<strlen(s);i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
s[i]=s[i]-'A'+'a';
}
}
}
int panduan(char s[])
{
int num=strlen(s);
char s1[num];
strcpy(s1,s);
un(s1);
int sea=1;
for(int i=0;i<num/2;i++)
{
if(s1[i]!=s1[num-1-i])
{
sea=0;
break;
}
}
return sea;
}//这个判断回文字符的函数是正确的
int main()
{
char s[5000];
gets(s);//s是输入的字符串
int length=strlen(s);
char huiwenzancun[5000]={'\0'};//暂存回文
int huiwenlenth=1;
int i=0;
int start=0;
int end=0;
if(length>0&&length<2&&((s[0]>='a'&&s[0]<='z')&&(s[0]>='A'&&s[0]<='Z')))//只输入一个字符
{
huiwenzancun[i]=s[i];
}
else if(length<2||length==0)
printf("NULL");
else
{
for(i=0;i<length;i++)
for(int j=i+1;j<length;j++)
{
char t[5000]={'\0'};//用来存放s[i]到s[j]的字符串
int a=0;
for(int k=i;k<=j;k++)
{
if((s[k]>='a'&&s[k]<='z')||(s[k]>='A'&&s[k]<='Z'))
{
t[a]=s[k];
a++;
}
}
if((panduan(t))==1&&strlen(t)>huiwenlenth)
{
huiwenlenth=strlen(t);
strcpy(huiwenzancun,t);
start=i;
end=j;
}
}
for(int op=start;op<=end;op++)
printf("%c",s[op]);
}
}