对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
不要试图枚举每一个字符进而寻找对称字符,可以这样考虑:从中间的一个字符向字符串两端扩展,
1.对称子串为偶数串,以两个字符为轴向两边扩展,若找到对称的就+2并更新最大值
2.对称子串为奇数串,则以该字符为轴向两侧扩展,若找到对称的就+2并更新最大值
#include <bits/stdc++.h>
using namespace std;
char s[1100];
int main()
{
gets(s);
int l=strlen(s),x,y,ans,Max=1;///进行奇数串判定时ans最小也是1,这样一定会更新Max的值(题目没说给的串一定对称),更何况这个串长度一定是大于1的
for(int i=0;i<l;i++)
{
ans=0;
x=i;
y=i+1;
while(s[x]==s[y]&&x>=0&&y<l)
{
x--;
y++;
ans+=2;
}
if(ans>Max)
Max=ans;
}
for(int i=1;i<l;i++)
{
ans=1;
x=i-1;
y=i+1;
while(s[x]==s[y]&&x>=0&&y<l)
{
x--;
y++;
ans+=2;
}
if(ans>Max)
Max=ans;
}
printf("%d\n",Max);
return 0;
}