KMP

来源:互联网 发布:windows哪个版本最好 编辑:程序博客网 时间:2024/05/29 05:06

思路不说了,也不分析了,自己看数据结构的书p80~p84

这里贴下代码就是了,另外推荐学习这节内容的一些好资料

严蔚敏求next视频     

这个有点多,可以说是比较啰嗦,但是很详细,讲了有好久

这个是这个算法的演示

还有类似的相关代码的实现,全部在我的资源里面

 

下面的是求next的代码

 
void get_next(char *t){int j=1,k=0;next[1]=0;while (j<=t[0]){        if (k==0||t[j]==t[k]){++j,++k;next[j]=k;}else{k=next[k];}}}


 

但是这个还没有完全优化,就是 模式串有字符重复的时候例如:

主串s:aaabaaaab

模式串:aaaab

在这里   由于模式串前面的相同,程序在运行到i=4时,可以直接跳过后面四个a,就是这里做了一点优化

下面是优化后的代码

void get_nextval(char *t){     int i=1;     nextval[1]=0;     int j=0;     while (i<t[0])     {           if (j==0||t[i]==t[j])           {              ++i;              ++j;              if (t[i]!=t[j])                  nextval[i]=j;              else                  nextval[i]=nextval[j];                             }           else           {               j=nextval[j];           }     }}

最后是整个程序的代码:

#include <iostream>using namespace std;#include <string.h>int *nextval=new int[1005];int Run(char *s,char *t,int pos){int i=pos,j=0;while (i<=s[0]&&j<=t[0]){if (j==0||s[i]==t[j])//{++i,++j;}else{j=nextval[j];}}if (j>t[0])return i-t[0];elsereturn 0;}void get_nextval(char *t){     int i=1;     nextval[1]=0;     int j=0;     while (i<t[0])     {           if (j==0||t[i]==t[j])           {              ++i;              ++j;              if (t[i]!=t[j])                  nextval[i]=j;              else                  nextval[i]=nextval[j];                             }           else           {               j=nextval[j];           }     }}int main(){char s[1002],t[1002];while (cin>>s>>t){int i=0,len1=strlen(s),len2=strlen(t);for (i=len1; i>=0; i--)s[i+1]=s[i];s[0]=len1;for (i=len2; i>=0; i--)t[i+1]=t[i];t[0]=len2;get_nextval(t);cout<<"出现的位置是:"<<Run(s,t,0)<<endl;/*for (i=Run(s,t,1); len2--; i++)cout<<s[i];cout<<endl;*/}delete []nextval;return 0;}


 

 

原创粉丝点击