kmp 算法

 1 void GetNextval(char[] p, int[] next)
 2     {
 3         int pLen = p.length;
 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                 ++j;
13                 ++k;
14 
15                 if(p[j] != p[k])
16                     next[j] = k; 
17                 else
18                     next[j] = next[k]; // 因为不能出现p[j] = p[next[j]),所以需要递归,k=next[k]=next[next[k]]
19                 
20             }
21             else
22             {                
23                 k = next[k];
24             }
25         }
26         
27     }
28     
29     
30     int KmpSearch(char[] dst, char[] mode, int[] next)
31     {
32         GetNextval(mode, next);    
33         int i = 0, j = 0;
34         int sLen = dst.length;
35         int pLen = mode.length;
36         while(i < sLen && j < pLen)
37         {
38             if(j == -1 || dst[i] == mode[j])
39             {
40                 i++;
41                 j++;
42             }
43             else
44             {
45                 j = next[j];
46             }
47         }
48         if(j == pLen)
49             return i - j;
50         else
51             return -1;
52     }

代码改自: http://blog.csdn.net/v_july_v/article/details/7041827

posted @ 2015-03-16 17:01  David_W  阅读(156)  评论(0编辑  收藏  举报