zoukankan      html  css  js  c++  java
  • 数据结构/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<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;
    }

     

     

  • 相关阅读:
    linux中如何修改文件夹的用户权限 chown命令
    httpserver
    协程
    进程和线程的区别和联系
    python线程的GIL问题(全局解释器锁)
    线程同步互斥的方法
    threading模块创建线程
    信号量(信号灯)
    信号通道
    内存共享
  • 原文地址:https://www.cnblogs.com/elegantcloud/p/13827492.html
Copyright © 2011-2022 走看看