KMP算法
标签:isp width ++ 位置 pre 字符 idt 最长前缀 closed
KMP:一种模式匹配算法
重点:next数组:长度就是模式子串的长度
next[i]的值是若第i个位置不匹配则下一个要进行匹配的首地址
重点理解前缀后缀:例如:abcabc的最长前缀abc,后缀abc,
aaaa的前缀是aaa(aaaa就没有意义了)后缀是aaa.
分析:j值回溯:j返回到前一个失配的适配值
代码记住就好,感觉就是恰好就是这样,理解起来好难!!
1 #include 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(i0])
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(i0] && j0])
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
KMP算法
标签:isp width ++ 位置 pre 字符 idt 最长前缀 closed
原文地址:https://www.cnblogs.com/wuweixiong/p/13586031.html
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
KMP算法
文章链接:http://soscw.com/index.php/essay/69863.html
评论