您的位置:首页 > 其它

最长回文字串

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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: