最长回文子串
首先解决“判断时忽略标点,输出进却要按原样”的问题?
可以用一个简单的方法:构造一个新字符串,不包含原来的标点符号,而且所有字符变成小写(顺便解决了大小写的问题)。
由于在求最大值时,不知道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;
}