对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路:
之前做过部分求回文、对称式,大都是让输出具体的回文,且回文唯一,这种情况可以考虑从头和尾同时遍历、顺序查找或者是对半查找
现在这道题需要找到最长对称子串长度。
情况一:回文不唯一,而且分布不均匀。可能前半段的串里面有4条回文,后半段只有1条。例如输出样例中的 Is PAT&TAP symmetric? ,"
PAT&TAP
"、"mm"都是回文。
情况二:以同字符为中心的回文。例如输出样例中的 Is PAT&TAP symmetric? ,"
PAT&TAP
"、"
、AT&TA
""
都是回文。T&T
"
情况三:老问题,关于回文的奇偶。、
处理情况二,直接寻找中心字符,以它为中心向它两侧查找;
处理情况一,在处理二的外面套一层遍历;
处理情况三:想法是直接暴力地算两遍,第一遍只算奇数的,第二遍只算偶数的;
代码(未ac):
提交了一遍算奇、偶两遍的反而产生了更多错误测试点..........
#include<bits/stdc++.h> using namespace std; int main() { string t; int a[1050]= {0}; getline(cin,t); //输入 int len=t.size(); //串长 int i,j; for(i=0; i<len; i++) { int s=i; int test=1; for(j=0; j<len; j++) { if(t[s-test]==t[s+test]) { a[i+1]+=2; test++; if((s-test)<0) { break; } } else { break; } } } int max=0; for(i=0; i<len; i++) { if(a[i]>max) { max=a[i]; } } cout<<max+1; return 0; }