题意:整个文件中的字符可以看成一个长的字符串,忽略其中除了字母之外的东西以及字母的大小写区别,求最长的回文的长度和内容
解题思路:
- 读入这个字符串,存入input_string中
- 对着个字符串进行裁剪,去除其中字母以外的内容,并且将其中的字母全部转换为小写,存与一个字符数组input_trim中。在处理的过程中用以个数组sheet记录下input_trim中每个字符在input_string中的位置
- 从最长的长度max_len开始,查找input_trim中是否存在这样长度的回文,如果没有则max_len递减,如果有则直接输出解决问题。(max_len取2000和input_trim长度的较小值)
- 最后要求输出最长回文的内容,根据前面的sheet数组可以很方便地查找到input_trim中符合要求的字符串在input_string中的起始点,从而输出结果
代码:
/*
ID: zc.rene1
LANG: C
PROG: calfflac
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE *fin, *fout;
char input_string[20000];
int sheet[20000];
int is_palindrome(char input_trim[], int start, int end){
int ret=1;
while(start<=end){
if(input_trim[start]!=input_trim[end]){
ret=0;
break;
}
start++;
end--;
}
return ret;
}
void find_longest_palindrome(char input_trim[], int index_trim){
int max_len=(index_trim>2000)?2000:index_trim;
int i, j;
while(max_len-->0){
for(i=0; i<=index_trim-max_len; i++){
if(is_palindrome(input_trim, i, i+max_len-1)){
fprintf(fout, "%d\n", max_len);
for(j=sheet[i]; j<=sheet[i+max_len-1]; j++){
fprintf(fout, "%c", input_string[j]);
}
fprintf(fout, "\n");
return ;
}
}
}
}
int main(void){
fin=fopen("calfflac.in", "r");
fout=fopen("calfflac.out", "w");
char input_trim[20000];
int i, index=0, index_trim=0;
char in;
while(fscanf(fin, "%c", &in)==1){
input_string[index++]=in;
if(isalpha(in)){
sheet[index_trim]=(index-1);
input_trim[index_trim++]=tolower(in);
}
}
find_longest_palindrome(input_trim, index_trim);
return 0;
}