title: L2-008. 最长对称子串
tags: [天梯赛]
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
分析
直接暴力肯定会超时,讲一下别人的思路:外层循环遍历字符串的位置,并且以此位置作为对称轴,内层循环以此对称轴为中心,来检查离对称轴左右相等距离的位置的字符是否相同,若相同,让距离增加一个,并且记录下来满足条件的字符个数。
代码
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main() {
char a[1005];
gets(a);
int len=strlen(a);
int maxLen=1;
for(int i=0;i<len;i++)
{
//这是回文串的个数为奇数的情况
int temp=1;//对称轴本身就是一个
for(int j=1;j<len;j++)
{
//j==1时,i-j,对称轴左边一个的字符 ,i+j 对称轴右边一个的字符
if(i-j>=0&&i+j<len&&a[i-j]==a[i+j])
temp+=2;//左右各扩展一个,所以是加2
else break;
}
maxLen=max(maxLen,temp);
//这是回文串的个数为偶数的情况
temp=0;
for(int j=1;j<len;j++)
{
if(i-j+1>=0&&i+j<len&&a[i-j+1]==a[i+j])
temp+=2;
else break;
}
maxLen=max(maxLen,temp);
}
cout<<maxLen;
return 0;
}