KMP算法

来源:互联网 发布:color picker mac 编辑:程序博客网 时间:2024/06/04 18:54
//本程序是引用他人的思想,额,忘记是哪位大神了,这个程序是之前写的#include <iostream>#include <cstring>using namespace std;//方便对照,BFMatch函数是原始匹配函数int BFMatch(char *s,char *p){int i=0,j=0;int nSLen=strlen(s),nPLen=strlen(p);while(i<nSLen){j=0;while(s[i]==p[j]&&j<nPLen){i++;j++;}if(j==nPLen){return i-nPLen;}i=i-j+1;//指针i的回溯}return -1; }//getNext函数创建next[],作用与指针回调void getNext(char *p,int *next){int j=0,k=-1;int nPLen=strlen(p);next[0]=-1;while(j<nPLen-1){if(k==-1||p[j]==p[k]){//匹配情况下p[j]=p[k],p[0..k]=p[j-k,j] k++;j++;next[j]=k;//next[j+1]=next[j]+1=k+1;}else{k=next[k];}}}//KMP算法根据next[]来进行匹配int KMPMatch(char *s,char *p){int i=0,j=0;int nSLen=strlen(s),nPLen=strlen(p);int next[100];getNext(p,next);while(i<nSLen){if(j==-1||s[i]==p[j]){i++;j++;}else{j=next[j];//消除了指针i的回溯}if(j==nPLen){return i-nPLen;}}return -1;}int main(){char *s="ababc";char *p="abc";cout<<"s:"<<s<<endl;cout<<"p:"<<p<<endl;cout<<"模式匹配位置:"<<BFMatch(s,p)<<endl;cout<<"模式匹配位置:"<<KMPMatch(s,p)<<endl;  return 0;}

0 0
原创粉丝点击