对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路:遍历以这个字符串的每个字符为对称轴的每个对称子串(这些即为所有对称子串),找其中的最大长度即为最后答案。
遍历方法:用两个指针从最靠近对称轴的位置往两边扩展,每次判断对应位置的两个字符是否相等即可
完整代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
string s;
int maxL(bool type,int pos)
{
int len=1,start=pos-1,ed=pos+1;//默认type=false为长度为奇数的情况,此时最长对称子串至少为当前对称轴位置的这一个字符,所以len=1,起点=pos-1,终点=po+1
if(type){
len=0,start=pos;//type=true时,对称子串长度为偶数,所以len初始值为0(对称轴位置无字符),对称子串起点=pos,终点还是pos+1
}
while(start>=0&&ed<s.size()){//不断向两边扩展,找以当前字符为对称轴的最长对称子串的长度len
if(s[start]==s[ed]){
len+=2;
}
else{
break;
}
start--;
ed++;
}
return len;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
getline(cin,s);
int maxlen=1;//对称子串的最大长度至少为1
for(int i=0;i<s.size();i++){
int l=maxL(false,i);//取以当前i号位置为对称轴的且长度为奇数的所有对称子串的最大长度
int ll=maxL(true,i);//取以当前i号位置为对称轴的且长度为偶数的所有对称子串的最大长度
maxlen=max(max(maxlen,l),ll);//每次取前两者的max
}
cout<<maxlen<<endl;
return 0;
}