Calf Flac

来源:互联网 发布:设计算法需要考虑什么 编辑:程序博客网 时间:2024/06/06 05:11

题意:整个文件中的字符可以看成一个长的字符串,忽略其中除了字母之外的东西以及字母的大小写区别,求最长的回文的长度和内容


解题思路

  1. 读入这个字符串,存入input_string中
  2. 对着个字符串进行裁剪,去除其中字母以外的内容,并且将其中的字母全部转换为小写,存与一个字符数组input_trim中。在处理的过程中用以个数组sheet记录下input_trim中每个字符在input_string中的位置
  3. 从最长的长度max_len开始,查找input_trim中是否存在这样长度的回文,如果没有则max_len递减,如果有则直接输出解决问题。(max_len取2000和input_trim长度的较小值)
  4. 最后要求输出最长回文的内容,根据前面的sheet数组可以很方便地查找到input_trim中符合要求的字符串在input_string中的起始点,从而输出结果

代码

/*ID: zc.rene1LANG: CPROG: 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;}