【CCCC】L2-008 最长对称子串 (25分),直接枚举遍历
原创
©著作权归作者所有:来自51CTO博客作者小哈里1139的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;//数据5:最小子串是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;
}