最长回文子串
输入一个字符串,求出其中最长的回文子串。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应该保持原样(在回文串的首部和尾部不要输出多余字符)
样例:Confuciuss say:Madam,I'm Adam.
输出:Madam,I'm Adam
scanf("%s",s)输入字符串,但是碰到空格或者Tab就会停下来。
fgetc(fin)读取打开的文件fin,读取一个字符,返回一个int值。为什么返回int而不是char,因为EOF不是char,如果返回char,则EOF和普通字符没法区分了。
getchar() 等价于 fgetc(stdin)
fgets(buf,MAX,fin)读取完整的一行。
gets(s),没有指明读取的最大字符数,存在缓冲区溢出的危险。
*:不同操作系统的回车换行符是不一致的。
windows:'\r' '\n'俩个字符
linux : '\n'
MacOs : '\r'
void huiwen(const char *str)
{
int len = strlen(str);
char *pTemp = (char *) malloc(len);
memset(pTemp, 0, len);
int m = 0;
for(int i = 0; i < len; ++i)
{
if(isalpha(str[i]))//判断是否为字符
pTemp[m++] = toupper(str[i]);//转换为大写,保存在临时字符数组中
}
//枚举字符串,速度相对慢
int max = 0;
for(int i = 0; i < m; ++i)//i确定开始点
{
for(int j = i; j < m; ++j)//j确定结束点
{
int match = 1;
for(int k = i; k < j; ++k)
{
if(pTemp[k] != pTemp[j-k+i])//判读是否为回文
match = 0;
if(match && j-i+1>max)
max = j-i+1;
}
}
}
printf("Max = %d",max);//输出最大子串长度
free(pTemp);
}
void huiwei1(const char *str)
{
int len = strlen(str);
char *pTemp = (char *)malloc(len);
int *pPosition = (int *)malloc(len*sizeof(int));//记录字符在字符串的位置
memset(pTemp,0,len);
memset(pPosition,0,len*sizeof(int));
int m = 0;
for(int i = 0; i < len; ++i)
{
if(isalpha(str[i]))
{
pPosition[m] = i;//记录字符在字符串的位置
pTemp[m++] = toupper(str[i]);
}
}
int max = 0;
int x ,y;
for(int i = 0; i < m; ++i)
{
for(int j = 0; i-j >= 0 && i + j < m; ++j)//当字符串数为奇数时
{
if(pTemp[i-j] != pTemp[i+j])//以i为中心,比较两边的字符
break;
if(j*2+1 > max)
{
max = j*2+1;
x = pPosition[i-j];
y = pPosition[i+j];
}
}
for(int j = 0; i-j >=0 && i + j + 1 < m; ++j)//当字符串数为偶数时
{
if(pTemp[i-j] != pTemp[i+j+1])
break;
if(j*2+2 > max)
{
max = j*2 + 2;
x = pPosition[i-j];
y = pPosition[i+j+1];
}
}
}
for(int i = x; i <=y;++i)
printf("%c",str[i]);
printf("\n");
free(pTemp);
free(pPosition);
}
int main(void)
{
char buf[100] = {0};
fgets(buf,sizeof(buf)/sizeof(buf[0]),stdin);
// huiwen(buf);
huiwei1(buf);
return 0;
}