KMP算法详解

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

这篇博客形象地描述了KMP算法的原理

接下来代码实现的问题这篇讲得非常详细

http://billhoo.blog.51cto.com/2337751/411486

 

下面KMP代码其中char t[]是文本,char p[]是模式串,int pi[]是辅助数组

 1 // 判断t中是否含有p
 2 bool KMP(char *p, char *t)
 3 {
 4      getPI(p);
 5      int n = strlen(t);
 6      int m = strlen(p);
 7      
 8      int q=0;
 9      repA(0,n,i)
10      {
11           while(q>0 && p[q] != t[i])
12             q = pi[q-1];
13           if(p[q] == t[i])
14             ++q;
15           if(q == m)
16             return true;
17                      
18      } 
19 
20      return false;     
21 }
22 
23 // 获取辅助数组int pi[]
24 void getPI(char *p)
25 {
26      pi[0] = 0;
27      int k=0;
28      int m = strlen(p);
29      repA(1, m, q)
30      {     
31          
32          while(k>0 &&  p[k]!=p[q])
33            k = pi[k-1];
34          if(p[k] == p[q])
35            ++k;
36          pi[q] = k;
37          
38      }   
39      
40      return ;  
41 }
View Code

 

话说彻底理解KMP我花了近两天,是我脑子不好使还是...

 

 

posted on 2014-04-09 18:00  码农之上~  阅读(164)  评论(0)    收藏  举报

导航