首先解决“判断时忽略标点,输出进却要按原样”的问题?

可以用一个简单的方法:构造一个新字符串,不包含原来的标点符号,而且所有字符变成小写(顺便解决了大小写的问题)。

由于在求最大值时,不知道s[i]和s[j]在原串中的位置。因此,必须增加一个数组pos,用pos[i]保存s[i]在原串中的位置。

const int N=5010;
bool f[N][N];
string a,b;
int pos[N],cnt;

bool check(char c)
{
    if(isdigit(c)) return true;
    if(islower(c)) return true;
    if(isupper(c)) return true;
    return false;
}

int main()
{
    getline(cin,a);

    for(int i=0;i<a.size();i++)
    {
        if(check(a[i]))
        {
            if(isupper(a[i])) b+=tolower(a[i]);
            else b+=a[i];
            pos[cnt]=i;
            cnt++;
        }
    }

    int l=0,r=0;
    for(int i=cnt-1;i>=0;i--)
        for(int j=i;j<cnt;j++)
        {
            if(i == j) f[i][j]=true;
            else if(i+1 == j) f[i][j]=(b[i] == b[j]);
            else f[i][j]=f[i+1][j-1] && (b[i] == b[j]);

            if(f[i][j] && j-i+1 > r-l+1) l=i,r=j;
        }

    int len=pos[r]-pos[l]+1;
    cout<<a.substr(pos[l],len)<<endl;

    //system("pause");
    return 0;
}