字符串中最长的回文子串问题

来源:互联网 发布:域名删除时间到了 编辑:程序博客网 时间:2024/05/16 02:29
此题参考


Manache算法,网上很多网友都说需要在转换后的字符串(即是在字符串中添加了‘#’)的最前面加上一个额外的字符,但是我觉得没有必要这么做: 最初的时候我选择第二个字符作为mid 然后寻找后面是否有更适合做mid的字符,如果有则替换。

具体代码实现如下:

#include <stdio.h>
#include <string.h>

#define  MIN(a,b) ((a)>(b)?(b):(a))

void FullStr(char*res,char*des);
int FindMaxLen(char*res,int Len);

int main()
{
 char Res[1000],Des[1000];

 while (scanf("%s",Res)!=EOF)
 {
  FullStr(Res,Des);
  printf("%d\n",FindMaxLen(Des,strlen(Des)));
 }

 return 0;
}

//讲原字符串中添加上‘#’使得奇数和偶数个字符可以按照相同的方式处理。

void FullStr(char*res,char*des)
{
 int j=0;
 for (int i=0;res[i]!='\0';i++)
 {
  des[j++]='#';
  des[j++]=res[i];
 }

 des[j++]='#';
 des[j]='\0';
}

//寻找最大的回文子串的长度

int FindMaxLen(char*res,int Len)
{
 int P[2000]={0};
 int max=2;              //max代表最右边的最长子串的下标
 int id=1;              //最初的时候选择第二个字符作为最长子串的中间字符

 P[0]=1;
 P[1]=2;

 for (int i=2;i<Len;i++)
 {
  if (max>i)
  {
   P[i]=MIN(max-i,P[2*id-i]);       // 如果i在已有的最长子串的范围内,则比较i的对称点和i距离最长子串最右边的距离,选择较小者
  }
  else
  {
   P[i]=1;
  }

  while (i+P[i]<Len && i-P[i]>=0 && res[i+P[i]]==res[i-P[i]]) // i为中心向两边扩展
  {
   P[i]++;
  }

  if (P[i]>max-id+1)                        //如果作为中心的子串长度大于id为中心的子串长度,则替换id和max
  {
   id=i;
   max=id+P[i]-1;
  }
 }

 return max-id;            //返回最长子串长度
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 户口迁移身份证没换驾照怎么办 户口迁回时身份证掉了怎么办 户口毕业托管身份证掉了怎么办 身份证和户口都掉了怎么办 毕业生户口迁回原籍没身份证怎么办 落户上海后怎么办医保卡 小车临时牌过期了怎么办 驾驶证地址错了一个字怎么办 驾驶证名下车辆有违章怎么办 a2如果扣12分怎么办 b2一次超速12分怎么办 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办 a2驾照扣10分怎么办 驾驶证强制降级没给驾驶证怎么办 6P升11.2卡了怎么办 b2驾照记满12分怎么办 c1驾驶证没分了怎么办 驾照扣了15分怎么办 驾驶证暂扣六个月后怎么办 醉驾交警不通知怎么办 参军后地方驾驶证年审怎么办 军人驾驶证到期身份证注销了怎么办 资格证脱审30天怎么办 驾驶证c证扣6分怎么办 驾照被扣了9分怎么办 驾驶证被扣了9分怎么办 a2驾驶本扣3分怎么办 c1e没过扣了满分怎么办 c1一下扣12分怎么办 换证体检过不了怎么办 唐山驾驶本到期换本怎么办 北京居住证变更地址了怎么办 眼睛弱视驾驶证换证不了怎么办? 驾照的分扣完了怎么办 驾照被扣了3分怎么办 交警扣了行驶证怎么办 报考驾照时手机号录错怎么办 摩托车被交警队拖走怎么办 汽车牌照被偷了怎么办