KMP--字符匹配

来源:互联网 发布:掌商大数据 编辑:程序博客网 时间:2024/06/10 01:20
/*******  kmp_1.cpp   ******/  
#include<string.h>#include<stdio.h>#include"kmp_2.h"void get_next(char *T,int *next) //这个函数是重点{    int i=0, j=-1;//j在前,i在后,next[i]存的是i之前的串的最长公共前后缀长度    next[0]=-1;//初始时计算i=0,即考虑第0个字符,此时j应设为-1,next[i]=-1表i之前//的串没有公共前后缀    while(i<strlen(T))    {        if(j==-1||T[i]==T[j])        {            ++i;    //j先自增所以next[i]至少=0            ++j;            next[i]=j;        }        else j=next[j];//j最小=-1,利用已求得的next部分        }}int next[11];int main (){  char str[11]="abcdaabcab";  char src[30]="abcdabcdaabcabsd";  int i;  get_next(str,next);  for (i=0;i<11;i++)  {      printf("next[%d]=%d  ",i,next[i]);      if (i%5==0) printf("\n");  }  i=Index_KMP(src,str,2);  printf("\n%d",i);  return 0;}/****    restult  ***//**next[0]=-1 [1]=0 [2]=0 [3]=0 [4]=0 [5]=1 [6]=1 [7]=2next [8]=3 [9]=1 [10]=24**/

/***** kmp_2.h ******/
extern int next[11];int Index_KMP(char *S,char *T,int pos) //利用模式串T的next函数求T在S中S[pop]{//字符之后的位置的KMP算法,其中T非空,1<pos<S.length    int i=pos,j=0;    int sLength=strlen(S);    int tLength=strlen(T);    while(i<sLength&&j<tLength)    {        if(j==0||S[i]==T[j])        {            ++i;            ++j;        }        else j=next[j];//如果是穷举法,则此处next[j]=j++;    }    if(j>=tLength)return i-tLength;//找到了串的位置,退出时应该j==tLength    else return 0;}

	
				
		
原创粉丝点击