L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出\(11\)。
输入格式
输入在一行中给出长度不超过\(1000\)的非空字符串。
输出格式
在一行中输出最长对称子串的长度。
输入样例
Is PAT&TAP symmetric?
输出样例
11
作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:200 ms
内存限制:64 MB
PZ's Solution
1. 考虑到字符串的长度最大为\(1000\),使用\(O(n^2)\)算法即可;
2.遍历字符串,以遍历到的某个字符s
作为中间点,则有两种情况:
1).回文字符串长度为奇数,则当前字符为确定的中间点,往两边循环更新回文最大长度;
2).回文字符串长度为偶数,则当前字符和下一位字符为一个中心,往两边循环更新回文最大长度;
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int ans;
int main(){
getline(cin,s);
for(int i=0;i<s.size();++i){
int l=i,r=i,res1=-1,res2=0;
while(l>=0 && r<s.size() && s[l--]==s[r++]) res1+=2;
l=i,r=i+1;
while(l>=0 && r<s.size() && s[l--]==s[r++]) res2+=2;
ans=max(ans,max(res1,res2));
}
printf("%d",ans);
return 0;
}