最长对称子串

最长对称子串

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

输入格式:

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

输出格式:

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

输入样例:
Is PAT&TAP symmetric?
输出样例:
11
//方法一:最大回文数思想模板
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,i,p[2000005];
char str[1000005],s[2000005];

int Manacher(char *ch) 
{
    s[0]=1;//第一个字符不同,防止越界
    s[1]=2;
    char *t=s+2;
    while(*ch) 
	{
        *(t++)=*(ch++);
        *(t++)=2;
    }
    *(t++)='\0';

    int max1=0,j=0;
    p[0]=0;
    for(int i=2;s[i];++i) 
    {
        p[i]=(p[j]+j>i?min(p[(j<<1)-i],p[j]+j-i):1);
        while(s[i-p[i]]==s[i+p[i]])
            ++p[i];
        if(p[j]+j<p[i]+i)
            j=i;
        if(max1<p[j])
            max1=p[j];
    }
    return max1-1;
}

int main() 
{
    while(gets(str)) 
    {
        printf("%d\n",Manacher(str));
        break; 
    }
    return 0;
}
//方法二:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
char a[10005];   //字符串的储存
int b[10005];    //第一种方法
int c[10005];    //第二种方法
int main() 
{
  int n,m,i,j;
  gets(a);
  int len = strlen(a);
  for(i = 0;i < 10005; i++)
  {
    b[i] = 1;            //初始化为1;;
  }
  for(i = 0;i < 10005; i++)
  {
    c[i] = 0;             //初始化为0;;
  }
  for(i = 1;i < len; i++)
  {
    for(j = 1;j <= i; j++)   //从字符的两边开始查那就把j的开始为1;;
    {
      if(a[i+j] == a[i-j])     //如果相同
          b[i] = b[i]+2;       //那这个地方所配对的b加2;;
      else
          break;              //如果不相同直接跳出
    }
  }
  for(i = 1;i < len; i++)
  {
    for(j = 0;j <= i; j++)    //从空隙的两边开始查那就把j的开始为0;;
    {
      if(a[i+j+1] == a[i-j])        //这就是关键要正好为空隙的两边
          c[i] = c[i]+2;           //相同加2
      else 
          break; 
    }
  }
  int max = 0;
  for(i = 0;i < len;i++)           //找出最大的,,
  {
    if(max < b[i])
        max = b[i];
    if(max < c[i])
        max = c[i];
  }
  printf("%d\n",max);
  return 0;
}
//方法三:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int FUN(char *inp)//求最大对称子串长度
{
    int maxlen = 1;//最大长度
    int len=strlen(inp);//字符串长度 
    int record[len];//存包含该位及前个元素最长对称子串
    record[0]=1;
    int i;
    for(i=1;i<len;i++)
	{
        int max =1;
        if((i-record[i-1]-1)>=0 && inp[i] == inp[i-record[i-1]-1])
		{
            max = max>(record[i-1] + 2)? max:(record[i-1] +2);
        }
        int k = 1;
        while(inp[i] == inp[i-k])
		{
            k++;
        }
        max = max>k? max:k;
        record[i] = max;
        //printf("----- is:%d\n",record[i]);
        if(record[i]>maxlen) 
		{
			maxlen=record[i];
		}
    }
    return maxlen;
}


int main()
{
    char *input="abadddkeipdldlfk";
    int retlen = FUN(input);//从前向后递归
    printf("max length is:%d\n",retlen);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值