L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
code:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
string s;
getline(cin,s);
int maxlen=1;
for(int i=0;i<s.length();i++){
int temp=1;
for(int j=1;j<s.length();j++){//回文串是奇数
if(i-j>=0&&i+j<s.length()&&s[i-j]==s[i+j]) temp+=2;
else break;
}
maxlen=temp>maxlen? temp:maxlen;
temp=0;
for(int j=1;j<s.length();j++){
if(i-j+1>=0&&i+j<s.length()&&s[i-j+1]==s[i+j]) temp+=2;
else break;
}
maxlen=temp>maxlen? temp:maxlen;
}
cout<<maxlen;
}
其实就是回文串的长度判断。要区分奇数长度和偶数长度,遍历字符串的每一个字符作为起点,延两边扩散,如果扩散的两边一样则长度+2,若不一样则停止扩散,将当前长度与目前最大长度作比较。