对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
分析
数据很小,暴力求解即可,注意对称子串有奇数和偶数两种,分类讨论一下即可。
代码
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// . ' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
//
// .............................................
// 佛祖保佑 一发AC 永无BUG
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const double PI = acos(-1.0);
typedef pair<int,int> PII;
int main(int argc, char const *argv[]) {
string s;
getline(cin,s);
int ans = 1;
int n = s.size();
for(int i = 1; i < n - 1; i++) {
if(s[i] == s[i-1]) {//没有对称中心,长度为偶数
int now = 1;
while(i-now-1 >= 0 && i + now < n && s[i-now-1] == s[i+now]) now++;
ans = max(ans, now*2);
}
else if(s[i-1] == s[i+1]) {//对称中心为s[i],长度为奇数
int now = 1;
while(i-now >= 0 && i + now < n && s[i-now] == s[i+now]) now++;
ans = max(ans, now * 2 - 1);
}
}
cout << ans <<endl;
return 0;
}