最长回文子串
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
-
输入
-
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
- 输出所要求的回文子串。 样例输入
-
1 Confuciuss say:Madam,I'm Adam.
样例输出
-
Madam,I'm Adam
-
思路:从前往后找比较浪费时间,所以从中间往两边找。用两个指针记录字母分别往两边枚举。
-
注意:回文串的长度有可能为奇数也有可能为偶数。
#include<stdio.h> #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<map> #include<cmath> #define mv(a,b) memset(a,b,sizeof(a)); using namespace std; typedef long long LL; const int maxn=5000+10; const double eps=1e-8; const double PI =acos(-1.0); int pos[maxn]; char s[maxn],a[maxn]; bool judge(char s) { if((s>='a'&&s<='z')||(s>='A'&&s<='Z')) return true; return false; } int main() { // ios_base::sync_with_stdio(false); // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); int T; cin>>T; getchar(); while(T--) { memset(pos,0,sizeof(pos)); gets(s); int len=strlen(s); int k=0; for(int i=0;i<len;i++) { if(judge(s[i])) { if(s[i]>='A'&&s[i]<='Z') { pos[k]=i; a[k++]=s[i]-'A'+'a'; } else { pos[k]=i; a[k++]=s[i]; } } }//处理字符串。 int ll,rr,maxx; ll=0; rr=0; maxx=0; for(int i=0;i<k;i++) { for(int j=0;;j++) { if(i-j<0||i+j>=k) break; if(a[i-j]!=a[i+j]) break; if(j*2+1>maxx) { maxx=j*2+1; ll=pos[i-j]; rr=pos[i+j]; } }//字符串长度为奇数 for(int j=0;;j++) { if(i-j<0||i+j+1>=k) break; if(a[i-j]!=a[i+j+1]) break; if(j*2+2>maxx) { maxx=j*2+2; ll=pos[i-j]; rr=pos[i+j+1]; } }//字符串长度为偶数 } for(int i=ll;i<=rr;i++) cout<<s[i]; cout<<endl; } }
-
输入一个测试数据n(1<=n<=10);