★什么是回文串
就是正读与反读都相同的字符串。像werrrew这样的字符串。
★寻找字符串中最长的回文串
◇需要解决的问题
1、字符串输入与保存
字符串的输入函数有好多个,但是各自都有各自的限制。
scanf函数遇到“空格”和“TAB”键就终止输入;
getchar函数输入单个字符;
gets函数虽然能输入字符串,但是却没有指明读取的最大字符串数,很有可能读写到非法内存!
fgetc(stdin)与getchar函数等价
fgets(buf,MANX,stdin)则可以读取一整行放到数组buf中,因为此函数读到‘\n’时就会停止。
2、字母以外的字符处理
判断时忽略标点符号。可以使用函数isalpha(),此函数可以判断字符是否为字母。同时可以使用toupper()函数将大小写字母转化为同样的字母。该函数的头文件都为ctype.h
3、判断回文串
回文串的判断方法:可以从两边向内判断,也可以从内向两边判断
◇代码设计
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXN 5000 + 10 int main() { char buf_a[MAXN],buf_b[MAXN]; int i,j,k,len,max,x,y,p[MAXN]; fgets(buf_a,sizeof(buf_a),stdin); len = strlen(buf_a); k = 0; for(i = 0;i < len;i++) { if(isalpha(buf_a[i])) { buf_b[k] = toupper(buf_a[i]); p[k++] = i; } } max = 0; for(i = 0;i < len;i++) { for(j = 0;j <= i && i+j < len;j++) { if(buf_b[i-j] != buf_b[i+j]) break; if(max < 2*j+1) { max = 2*j+1; x = p[i-j]; y = p[i+j]; } } for(j = 0;j <= i && i+j+1<len;j++) { if(buf_b[i-j] != buf_b[i+j+1]) break; if(max < 2*(j+1)) { max = 2*(j+1); x = p[i-j]; y = p[i+j+1]; } } } for(i = x;i <= y;i++) { printf("%c",buf_a[i]); } return 0; }
★总结
◇思考
思考后得到的东西才是自己的,理解的也深刻,这也是学习能力的关键!遇到问题时不要急于寻求答案,可以将它看作为一次自我挑战,坚持独立思考,持续思考,问题多解,相信最终会受益的!
◇分析问题
我们遇到问题的阻碍之时,不能笼统的最自己说:这个问题我解决不了!我们要做的时分析,那么应该怎样分析呢?
1、拆分问题
一个问题解决不了,可能是因为其中的一个小问题的阻碍。就像上述问题,就起码包括三个小问题!多字符串的输入、字符串的处理、回文串的判断!正确的将问题拆分,将有利于问题的解决。
2、正确描述问题
正确的描述出自己所遇到的问题,有益于问题的解决!常问自己:我遇到的问题到底是什么?要解决这个问题还缺少什么?
3、确定问题的属性
知识层面的问题就是书本上或者网上能轻易查找到的!像什么叫回文串?
逻辑层面的问题必须通过自己的总结或者推理去探索的,不能够在书本或者网上轻易找到的问题!而逻辑层面的问题要比知识层面的问题要重要的多,也是重点去解决的问题
◇善于总结
要习惯将类似的知识点去做一下对比,找出各自的限制。区分相同点和不同点,这样会对知识有更深的了解!