数据结构/PTA-最长对称子串/串/数组


对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定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
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)
    {
        int s=i;
        int test=1;
        for(j=0; 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)
    {
        if(a[i]>max)
        {
            max=a[i];
        }
    }

    cout<1;
    return 0;
}

 

 

PTA