C/C++知识点之KMP
小标 2018-08-10 来源 : 阅读 1023 评论 0

摘要:本文主要向大家介绍了C/C++知识点之KMP,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之KMP,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

 KMP算法是用来求这类问题:求子串a在字符串b中的个数。
索引:如果我们按照普通方法求这个问题就是一一比较,然后移一位再一一比较,,,这样的结果显示是超时,因此前辈们总结出一种算法,它可以不需要一位一位的移,有时候可以移好多位,这样就可以很快得出答案了。
在这个算法中我们首先要对子串a进行分析,子串一般是比较短的,我们定义一个同样大小的数组next,分别对应子串里的每一位,我们分析子串里各个字符前后的重复与否,进行记录。
分析的结果就是如果next数组里的数不等于0,则说明子串的前缀和后缀有重复。(前缀,后缀的定义不明白的可以问问度娘)
借用一下别人的例子说明:

 
所以求这个next数组是第一步,也很重要,它的模板为下边,不长,但灰常神奇,前辈们太厉害啊
void get_next(int pl)       //pl为子串的长度
{    int i=0,j=-1;
   next[0]=-1;
   while(i<pl)
{   if(j==-1||p[i]=p[j])    //p为子串
   {   i++;j++;
      next[i]=j;   }
   else
  j=next[i];
}
}
而KMP就是利用这个next数组来比较的,代码和next的模板类似,直接套着用:
int KMP(int pl,int sl)   //sl为字符串长度
{  int i=0,j=0,sum=0;
  get_next(pl);
 while(i<sl&&j<pl)            //s为字符串
{   if(j==-1||p[j]==s[i])
    {   i++;j++; }
    else
    j=next[j];
   if(j==pl)
   { sum++;j=next[j];}
}
return sum;
}
next+KMP就可以求出子串在母串中的个数了,接下来就是next数组其他应用:
1、求一个字符串中的循环串,next数组模板+以下代码:
求出next数组后,
for(i=1;i<=pl;i++)
{len=i-next[i];            //len位循环串长度
if(len!=i&&i%len==0)
cout<<len<<" "<<pl/len<<endl;     //求出循环串长度和循环次数
}
2、求一个字符串的前缀和后缀重复的长度,next数组模板+以下代码:
求出next数组后,
int j=0;
for(int i=pl;p[i]!=-1;)
{   sum[j++]=i;            //sum数组里存放的就是前后缀重复子串的长度,然后遍历sum数组输出就好了
    i=next[i];

   

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程