problem
L2-008 最长对称子串 (25分) 对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式: 输入在一行中给出长度不超过1000的非空字符串。
输出格式: 在一行中输出最长对称子串的长度。
输入样例: Is PAT&TAP symmetric? 输出样例: 11
solution
给定一个字符串,输出最长对称子串的长度。第一个想法是二分长度,每次O(n)枚举起点,O(m)判断,复杂度O(logn*n*m)然后其实可以直接枚举对称轴O(n),每次向左右扫描判定O(m/2),复杂度O(n*m/2),省去了不必要的遍历(即左右不等时直接停止,不用判断整个长的字符串)(算是一种比较贴合题意的遍历方式)
#include<bits/stdc++.h>
using namespace std
;
int main(){
string s
; getline(cin
,s
);
int ans
= 1;
for(int i
= 0; i
< s
.size(); i
++){
int l
= i
, r
= i
+1;
if(s
[l
]==s
[r
]){
l
--; r
++;
while(l
>=0&&r
<s
.size() && s
[l
]==s
[r
]){l
--;r
++;}
}else if(l
>0 && s
[--l
]==s
[r
]){
l
--; r
++;
while(l
>=0&&r
<s
.size() && s
[l
]==s
[r
]){l
--;r
++;}
}
l
++;r
--;
ans
= max(ans
,r
-l
+1);
}
cout
<<ans
<<endl
;
return 0;
}