pat 最长对称子串

13 篇文章 0 订阅
4 篇文章 0 订阅


L2-008. 最长对称子串

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11

思路:

恩,我好像傻傻分不清子序列和子串的区别,然后怼死在这题上,每次在训练的时候碰到自己的思维误区的时候,就感觉自己做了有营养的题目。


子串的话就好做多了,最简单的就是暴力o(n^2)去暴力区间,然后再花o(n)的时间去check是否是回文串。


还有一种做法是o(n^2)的, 我们去枚举字符串里每个字符,把这个字符当做回文串的中心去往外扩展,如果两端的字符相等就扩展,如果不等,那么再扩展下去也就肯定不是回文串了,所以停止扩展,每次都更新下最大长度。要注意下对奇数、偶数的回文串进行判定。


o(n^3)的代码:

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char str[maxn];
bool check(char *a, char *b)
{
    while(a<b)
    {
       if(*a==*b)a++,b--;
       else break;
    }
    if(a>=b)return true;
    else return false;
}
int getlongeststring(char *a)
{
    char *first, *last;
    int len=strlen(a);
    first=a;
    int res=1, slen=0;
    while(first<=&a[len-1])
    {
        last=first+1;
        while(last<=&a[len-1])
        {
            if(check(first, last)){res=(last-first+1)>res?(last-first+1):res;};
            last++;
        }
        first++;
    }
    return res;
}
int main()
{
    gets(str);
    int i, j;
    int len=getlongeststring(str);
    cout<<len<<endl;
}


o(n^2)的代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char str[maxn];
int getlongest(char*a)
{
    char *pchar, *first, *last;
    int len=strlen(a);
    pchar = a;
    int res=0;
    while(*pchar!='\0')
    {
 //       printf("%c\n", *pchar);
       first=pchar;
       last=pchar+1;
       while(first>=a && last<=(a+len-1) && *first==*last)
       {
            first--;
            last++;
       }
       res=(last-first-1)>res?(last-first-1):res;
       
       first=pchar-1;
       last=pchar+1;
       while(first>=a && last<=(a+len-1) && *first==*last)
       {
            first--;
            last++;
       }
       res=(last-first+-1)>res?(last-first-1):res;
       
       pchar++;
    }
    return res;
}
int main()
{
    gets(str);
    int i, j;
    cout<<getlongest(str)<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值