最长对称子串


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;
}

原文地址:https://www.cnblogs.com/dccmmtop/p/6710406.html