KMP算法

KMP:一种模式匹配算法

重点:next数组:长度就是模式子串的长度

   next[i]的值是若第i个位置不匹配则下一个要进行匹配的首地址

重点理解前缀后缀:例如:abcabc的最长前缀abc,后缀abc,

            aaaa的前缀是aaa(aaaa就没有意义了)后缀是aaa.

 

 

 

 

 

 

 分析:j值回溯:j返回到前一个失配的适配值

代码记住就好,感觉就是恰好就是这样,理解起来好难!!

 1 #include <stdio.h>
 2 typedef char *String;
 3 void get_next(String T,int *next)
 4 {
 5     int i = 1;
 6     int j = 0;
 7     next[1] = 0;
 8     while(i<T[0])
 9     {
10         if(j==0 || T[i]==T[j])
11         {
12             i++;
13             j++;
14             //next[i] = j;
15             //改进的KMP的next数组
16             if(T[i]!=T[j])       //若当前字符与前缀字符不同
17                 next[i] = j;        
18             else
19                 next[i] = next[j];
20         }
21         else
22         {
23             j = next[j];
24         }
25     }
26 }
27 
28 //返回子串T在主串S的第pos个字符之后的位置
29 //若不存在,则返回0
30 int index_KMP(String S,String T,int pos)
31 {
32     int i = pos;
33     int j = 1;
34     int next[255];
35 
36     get_next(S, next);
37     while(i<=S[0] && j<=T[0])
38     {
39         //容易丢掉j==0,因为后面next[j]可能=0
40         if(j==0 || S[i]==T[j])
41         {
42             i++;
43             j++;
44         }
45         else
46         {
47             j = next[j];
48         }
49     }
50     if(j>T[0])
51     {
52         return i - T[0];
53     }
54     else
55         return 0;
56 }
57 
58 int main()
59 {
60     char str[255] = " ababab";
61     int next[255];
62 
63     str[0] = 6;
64     get_next(str, next);
65 
66     for (int i = 1; i < 7;i++)
67         printf("%d ", next[i]);
68 }
View Code

 

posted @ 2020-08-30 18:16  wind_y  阅读(110)  评论(0编辑  收藏  举报