KMP算法实现目标串与模式串匹配

 1 //KMP算法实现字符串匹配 

 2 //该算法保证字符比较次数不超过目标串字符长度的2倍 

 3 #include <cstdlib>

 4 #include <iostream>

 5 

 6 using namespace std;

 7  

 8  void compute_next(int* next,char const*p,int len){//计算模式串中元素序号j的左侧最大重叠度 

 9       int j=0;

10       int q=next[0]=-1;

11       --len;

12       while(j<len)

13       if(q==-1||p[q]==p[j])

14       next[++j]=++q;

15       else 

16       q=next[q];

17       } 

18 

19 char const* kmp_find(char const*t,int tlen,char const*p,int plen,int const*next){

20       int i=-1;

21       int j=-1;

22       while((i<tlen)&&(j<plen)){

23         if((j==-1)||(t[i]==p[j])) {++i;++j;}

24         else j=next[j];                        

25                                 }

26       if(j==plen) return t+i-plen;

27       else return 0;                               

28                                       }

29  

30 int main()

31 {   char a[100]="ahgdhjggabcabcabbacll";//用户自编目标串 

32     char b[12]="abcabcabbac";//用户自编模式串 

33     char const* t_;

34     int next[11];//与b串的元素个数相同,不含null 

35     compute_next(next,b,11);// 与b串的元素个数相同,不含null

36     

37     cout<<"target string:"<<endl;

38     for(int i=0;a[i];i++)

39      cout<<a[i];

40       cout<<endl; cout<<endl; 

41     cout<<"mode string:"<<endl;

42     for(int i=0;b[i];i++)

43      cout<<b[i];

44       cout<<endl;cout<<endl; 

45      

46     cout<<"最大重叠度计算为:"<<endl;

47      for(int i=0;i<11;i++)

48           cout<<"pi("<<i<<"):"<<next[i]<<endl;

49       cout<<endl; 

50           

51     t_=kmp_find(a,100,b,11,next);

52    if(!t_)

53       cout<<"can not find mode string in target string!"<<endl;

54       else 

55       cout<<"the position of mode string in target string is:"<<t_-a+1<<endl;

56     system("PAUSE");

57     return EXIT_SUCCESS;

58 }

 

你可能感兴趣的:(KMP)