题目地址:http://wikioi.com/problem/1568/
昨天实在太累了,就稍微看了一下题目,分析了一下,发现在不佳的状态下分析问题,越分析越累= =
然后,今天起来继续看,参考了一下之后,经过几番周折,终于还是实现了。不容易呀。
思路也很直接,爆搜。从第一个字符开始,向两边出发判断回文。发现不相等的字符或者出界了就停止,继续下一个的判断。
需要注意的问题,也是我实现过程中出的问题:
1、判断是不是字符的函数,可以使用<ctype.h>里面的 isalpha函数判断;
2、由于输入中含有空格和回车符,因此,普通的%s是不行的,它遇到空格就读取完毕了。
"%2000[^EOF]" scanf的正则表达式,意思是,可以最大输入2000个字符,一直读取,直到读取到'EOF'字符,就跳出;
3、要记录的是带有字符数据的下标,不是非字符;
4、字符统一成小写或者大写来判断;
//从中间向两边爆搜
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int beg=0;
int end=0;
int max=0;
//提取字符出来比较; 记录回文的字符的开头结尾; 记录回文中字符数
//奇数回文判断
void check(char *input,int poi,int len)
{
int l = poi-1,r = poi+1;
int lst_beg= l,lst_end = r;
int count=0;
//判断最中间的字符是否是字母
if( isalpha(input[poi]))
{
count=1;
}
for( ;l >= 0 && r < len ; )
{
if(!isalpha(input[l]))
{
l--;
}
else if(!isalpha(input[r]))
{
r++;
}
//字符统一成小写的
else if( tolower(input[l]) == tolower(input[r]))
{
//记录上一次,是字符的位置
lst_beg = l;
lst_end = r;
l--;
r++;
count +=2;
}
//发现不相等的字符; 立即处理
else
{
break;
}
}
//超出界限判断
if( count > max)
{
beg = lst_beg;
end = lst_end;
max = count;
}
}
//偶数回文判断
void check2(char *input,int poi,int len)
{
int l=poi,r=poi+1;
int count=0;
int lst_beg= l,lst_end = l;
for( ;l >= 0 && r < len ; )
{
if(!isalpha(input[l]))
{
l--;
}
else if(!isalpha(input[r]))
{
r++;
}
//字符统一成小写的
else if( tolower(input[l]) == tolower(input[r]))
{
lst_beg = l;
lst_end = r;
l--;
r++;
count +=2;
}
//发现不相等的字符; 立即处理
else
{
break;
}
}
//超出界限判断
if( count > max)
{
beg = lst_beg;
end = lst_end;
max = count;
}
}
int main()
{
char input[20010];
int i;
char c;
//直到输入的文件尾才结束
scanf("%20010[^EOF]",input);
/*
for(i=0 ; (c=getchar()) != EOF ; i++)
{
input[i] = c;
}
*/
int len = strlen(input);
//int len = i;
for(i=0 ; i < len ; i++)
{
check(input,i,len);
check2(input,i,len);
}
input[end+1] = '\0';
printf("%d\n%s",max,input+beg);
return 0;
}