KMP匹配算法

来源:互联网 发布:上瘾网络剧花絮下载 编辑:程序博客网 时间:2024/06/06 20:40
/***字符串匹配算法***/#include<cstring>#include<iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;#define MAXSTRLEN 255   //用户可在255以内定义最长串长typedef char SString[MAXSTRLEN+1];//0号单元存放串的长度Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串Tint i;if (strlen(chars) > MAXSTRLEN)return ERROR;else {T[0] = strlen(chars);for (i = 1; i <= T[0]; i++)T[i] = *(chars + i - 1);return OK;}}//计算next函数值 void get_next(SString T,int next[])//求模式串next函数值并存入数组next中{   int i=1;int j=0;next[1]=0;while(i<T[0]){   if(i<T[0]||T[i]==T[j]){++i;++j;    next[i]=j;}else          j=next[j];}} //算法4.2 KMP算法//利用模式串T的next函数值求T在主串S中第pos个字符之后的位置//其中,T非空,1<=pos<=Strlength(S)int Index_KMP(SString S,SString T,int pos,int next[] ){int i=pos;int j=1;while(i<=S[0]&&j<=T[0]){if(j==0||S[i]==T[j]){i++;j++;}   //继续比较后继字符 else{j=next[j];      //模式串向右移动 }}if(j>T[0])  return i-T[0];//匹配成功 else     return 0;} int main(){SString S;StrAssign(S,"aaabbaba");SString T;StrAssign(T,"aab");int *p=new int[T[0]+1];//生成T的next数组get_next(T,p);cout<<"主串和子串在第"<<Index_KMP(S,T,1,p)<<"个字符处首次匹配\n";return 0; } 

0 0
原创粉丝点击