最长回文字串
2015-06-18 15:20
197 查看
scanf("%s")输入字符串碰到空格或者TAB就会停下来。此处可以使用fgets或者gets;另外注意头文件cctype中的函数的巧妙使用,此处使用isalpha和toupper简化了代码。此处枚举字符串的中间位置,然后向俩边扩展,节省了时间复杂度,注意向俩边扩展时,奇数个和偶数个长度的区别。另外编程思想:在实际编程时,我们可以先编写一个具备主要功能的程序,再加一完善。我们甚至可以先写一个只有输入输出功能的'骨架“,但是要确保它正确。这样,每次只添加一点点小功能,而且写一点就测试一点,和一次写完整个程序相比,更不容易出错。这种方法成为迭代式开发。
#include<stdio.h>#include<math.h>#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cctype>using namespace std;#define LL long longchar buf[5005],s[5005];int p[1005];int main(){while(fgets(buf,sizeof(s),stdin)){int n=strlen(buf);int m=0;for(int i=0;i<n;i++){if(isalpha(buf[i])){p[m]=i;s[m++]=toupper(buf[i]);}}int max=0,x,y;for(int i=0;i<m;i++){for(int j=0;i-j>=0&&i+j<m;j++){if(s[i-j]!=s[i+j]) break;if(j*2+1>max){max=2*j+1;x=p[i-j];y=p[i+j];}}for(int j=0;i-j>=0&&i+j+1<m;j++){if(s[i-j]!=s[i+j+1]) break;if(j*2+2>max){max=j*2+2;x=p[i-j];y=p[i+j+1];}}}for(int i=x;i<=y;i++)printf("%c",buf[i]);cout<<endl;}return 0;}另外说下暴力的方法,即枚举回文子串的起始位置,然后判断是否正确。
#include<stdio.h>#include<math.h>#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cctype>using namespace std;#define LL long longchar buf[5005],s[5005];int p[1005];int main(){while(fgets(buf,sizeof(s),stdin)){int n=strlen(buf);int m=0;for(int i=0;i<n;i++){if(isalpha(buf[i])){p[m]=i;s[m++]=toupper(buf[i]);}}int max=0,x,y;for(int i=0;i<m;i++){for(int j=i;j<m;j++){int ok=1;for(int k=i;k<=j;k++)if(s[k]!=s[i+j-k]) ok=0;if(ok&&j-i+1>max){max=j-i+1;x=p[i];y=p[j];}}}for(int i=x;i<=y;i++)printf("%c",buf[i]);cout<<endl;}return 0;}
相关文章推荐
- qq登陆
- 插件开发技术(9)---SQL查询记录与对象的映射
- 支付宝手机网站即时交易 自己封装的类
- linux环境下python 库模块安装
- Search Insert Position
- Objective-C----实例变量
- 1.13
- ISO7816 (part 1-3) asynchronous smartcard information
- servlet交互案例分析及终极实现 使用jdbc连接数据库实现
- centos安装配置lnmp
- ofbiz中的container-1
- Access数据库技巧汇集
- sublime设置缩进和禁止更新
- 关于GPRS模块启动问题。
- phonegap(cordova)在ios系统实现录音功能的几种特殊情况
- Complete list of APDU responses
- java 反射创建对象并传入参数
- 领域驱动设计之领域模型
- 【程序员面试宝典】找规律
- php socket