题目描述
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同。如abba和yyxyy。在判断回文时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串长度不超过5000,且占据单独的一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。
输入
一行字符串,字符串长度不超过5000。
输出
字符串中的最长回文子串。
样例输入
Confuciuss say:Madam,I’m Adam.
样例输出
Madam,I’m Adam
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=5010;
int dp[maxn][maxn];
bool isalpha(char c){
if(c>=97 && c<=122)
return true;
if(c>=65 && c<=90)
return true;
return false;
}
bool isdigit(char c){
if(c>='0' && c<='9')
return true;
return false;
}
int main(){
char a[maxn],b[maxn];
int p[maxn],start;
int k=0,ans=1;
gets(a);
for(int i=0;i<strlen(a);i++){
if(isalpha(a[i]) || isdigit(a[i])){
p[k]=i;
if(a[i]>=97 && a[i]<=122)
b[k]=a[i]-32;
else
b[k]=a[i];
k++;
}
}
start=0;
for(int i=0;i<k;i++){
dp[i][i]=1;
if(i<k-1){
if(b[i]==b[i+1]){
dp[i][i+1]=1;
start=i;
ans=2;
}
}
}
for(int L=3;L<=k;L++){
for(int i=0;i+L-1<k;i++){
int j=i+L-1;
if(dp[i+1][j-1]==1 && b[i]==b[j]){
dp[i][j]=1;
start=i;
ans=L;
}
}
}
for(int i=p[start];i<=p[start+ans-1];i++){
cout<<a[i];
}
cout<<endl;
return 0;
}