博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

KMP算法

 首先一个next[]数组用来进行如果匹配失败,进行移动的地方

 

 1 void next_get(string pos,int size,int next[])
 2  {
 3            int k=-1;
 4            next[0]=-1;
 5          for(int i=1;i<size;i++)
 6         {
 7             while(k>-1&&pos[k+1]!=pos[i])
 8               k=next[k];
 9              if(pos[k+1]==pos[i])     
10                  k++;
11               next[i]=k;
12 
13         }
14 
15  }
16   int KMP(sting s,int next[],string pos)
17   {
18 
19        int a=s.size();//主串的长度
20        int b=pos.size();//要匹配字符串的长度
21        int k=-1; 
22        for(int i=0;i<a;i++)
23         {
24             while(k>-1&&s[i]!=pos[k+1])
25            k=next[k];
26            if(s[i]==pos[k+1])
27            k++;
28           if(k==b-1)
29          {  //k=-1;
30              //i=i-b+1;//注释的是要进行再次查询的
31              return i-k;
32          }
33         }      
34 
35    }
View Code

 

 1 void GetNext(char* p,int next[])  
 2 {  
 3     int pLen = strlen(p);  
 4     next[0] = -1;  
 5     int k = -1;  
 6     int j = 0;  
 7     while (j < pLen - 1)  
 8     {  
 9         //p[k]表示前缀,p[j]表示后缀  
10         if (k == -1 || p[j] == p[k])   
11         {  
12             ++k;  
13             ++j;  
14             next[j] = k;  
15         }  
16         else   
17         {  
18             k = next[k];  
19         }  
20     }  
21 }  
View Code

 

posted @ 2019-02-28 19:21  GUET_uzi  阅读(149)  评论(0编辑  收藏  举报

- 创建于 2018年9月1日

这是一位ACM爱好者&数学爱好者的个人站,内容主要是算法&数据结构&数学研究的技术文章,大部分来自学习,部分来源于网络,希望对大家有所帮助。