题目大意:中文题。
算法思路:假设每个字符都是回文串的中间字符,则每个字符都向两边扩展,取能够扩展最宽的,则必定是最长的回文子串。因此暴力枚举每个点即可,注意一下这个串可能是奇数也可能是偶数,因此对于每个字符,这两种扩展都要算一下,比较一下哪个是最长的。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define MAXN 5005 int t; char str[MAXN],str2[MAXN],indexx[MAXN]; int main() { scanf("%d",&t); getchar(); while(t--) { int k=0,m=-1,ml,mr; gets(str); int len=strlen(str); int siz=0; for(int i=0;i<len;i++) { if(isalpha(str[i])) { indexx[siz]=i; str2[siz++]=toupper(str[i]); } } for(int i=0;i<siz;i++) { k=0; while(true) { if(i-k<0||i+k>=siz) break; if(str2[i-k]==str2[i+k]) { k++; if(k>m) { m=k; ml=indexx[i-k+1]; mr=indexx[i+k-1]; } } else break; } k=0; while(true) { if(i-k<0||i+k+1>=siz) break; if(str2[i-k]==str2[i+k+1]) { k++; if(k>m) { m=k; ml=indexx[i-k+1]; mr=indexx[i+k+1-1]; } } else break; } } for(int i=ml;i<=mr;i++) { printf("%c",str[i]); } printf("\n"); } return 0; }