最长回文子字符串 还要更简单的方法

来源:互联网 发布:少年西游记手游源码 编辑:程序博客网 时间:2024/05/22 05:25

最长回文子串

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
输入
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
输出所要求的回文子串。
样例输入
1Confuciuss say:Madam,I'm Adam.
样例输出
Madam,I'm Adam
AC代码:
#include<iostream>using namespace std;#include<string.h>#include<stdio.h>#include<ctype.h>int main(){char a[5005],b[5005],e[5005];int n,l,k1,k2,max,b1,b2,i,j,c;cin>>n; getchar();  //吸收空格 while(n--){gets(a);l=strlen(a);for(i=0,j=0;i<l;i++)if(isalpha(a[i]))   //判断是否为字母 {   e[j]=i;   //记录改变过后字符串中每个字符原来的位置    b[j++]=tolower(a[i]);//如果 b[j]是字母的话, 则将之变为小写字母,toupper(a[i])是将之变为大写 ,加上头文件#include<ctype.h>    c=j;    }//for(i=0;i<c;i++)cout<<b[i];//cout<<"pppppppp"<<endl; for(i=0,b1=0,b2=0,max=0;i<c;i++)   //求字符串中最长的子字符串  for(j=i;j<c;j++) { if(b[j]==b[i]) { for(k1=i,k2=j;k1<(i+j)/2;k1++,k2--)  if(b[k1]!=b[k2])break; if(b[k1]==b[k2]&&k1>=(i+j)/2) { if((j-i+1)>max) { max=j-i+1; b1=i; b2=j; } }}}                                                //求最长的子字符串  for(i=e[b1];i<=e[b2];i++)    //输出原来的字符串  cout<<a[i]; cout<<endl;}
return 0;
0 0