输入一个字符串,求出其中最长的回文串。子串的含义是:在原串中连续出现的字符串片段。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出保持原样。输入字符串长度不超过5000,且单独占据一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。
#include "iostream"
#include "vector"
#include "string.h"
#include "set"
#include "ctype.h" //定义了isalpha,isdigit,toupper,tolower等
#include "stdio.h"
using namespace std;
const int MAX_N = 50010;
int p[MAX_N];
char s[MAX_N];
char buf[MAX_N];
int main()
{
fgets(buf, sizeof(buf), stdin); //读入一行
int len = strlen(buf);
int i, j, m = 0, max = 0, left, right;
for(i=0; i<len; i++)
{
if(isalpha(buf[i])) //如果是字母
{
p[m] = i; //s[m]在buf中的位置
s[m++] = toupper(buf[i]);
}
}
for(i=0; i<m; i++) //以i为中心,判断是否为回文串
{
for(j=0; i-j>=0 && i+j<m; j++) //长度为奇数
{
if(s[i-j] != s[i+j])
break;
if(j*2+1 > max)
{
max = j * 2 + 1;
left = p[i-j];
right = p[i+j];
}
}
for(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;
left = p[i-j];
right = p[i+j+1];
}
}
}
for(i=left; i<=right; i++)
cout << buf[i];
cout << endl;
return 0;
}