无回溯匹配模式
#include "stdio.h" #include "stdlib.h" struct SeqString { int MAXNUM; int n; char *c; }; typedef struct SeqString * PSeqString;
//创建空顺序串 PSeqString createNullStr_Seq(int m) { PSeqString pstr=(PSeqString)malloc(sizeof(struct SeqString)); if(pstr!=NULL) { pstr->c=(char *)malloc(sizeof(char)*m); if(pstr->c) { pstr->n=0; pstr->MAXNUM=m; return pstr; } else { free(pstr); } } printf("out of space! \n"); return NULL; }
//无回溯的模式匹配算法 int pMatch(PSeqString t,PSeqString p,int *next) { //变量next是数组next的第一个元素的next[0]的地址 int i,j; i=0; j=0; while (i<p->n && j<t->n) if (i==-1 || p->c[i]==t->c[j]) { i++; j++; printf("%c ",p->c[i]); printf("%d --",i); printf("%c ",t->c[j]); printf("%d \n",j); if (i >=p->n-1) { return (j-p->n+1); } } else { i=next[i]; } return 0; } //计算next数组 int * makeNext(PSeqString p,int *next) { int i=0; int k=-1; next[0]=-1; while (i<p->n-1) { while (k>=0 && (p->c[i]!=p->c[k]) ) { k=next[k]; } i++; k++; if(p->c[i]==p->c[k]) { next[i]=next[k]; } else { next[i]=k; } } return *next; }
测试:
int main() { char *c1,*c2; int i=0,k; int next[7]; PSeqString p1,p2; c1="abceabceabcddabcdabcdefjdkdsfjadflsdkjf"; c2="adflsd"; p1=createNullStr_Seq(40); p2=createNullStr_Seq(7); p1->c=c1; p1->n=40; p2->c=c2; p2->n=7; *next=makeNext(p2,next); for(k=0;k<7;k++) printf("%d ",next[k]); i=pMatch(p1,p2,next); printf("%d",i); return 1; }
输出结果:30
浙公网安备 33010602011771号