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 }

 

posted @ 2015-07-20 19:07  喜欢算法的小杰  阅读(751)  评论(0编辑  收藏  举报