KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。
分析:KMP模板题、KMP的关键是求出next的值、先预处理出next的值、然后一遍扫过、复杂度O(m+n)
实例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include<stdio.h> #include<string.h> #define N 1000005 int s[N]; int p[N]; int next[N]; int m,n; void getnext(){ int j=0,k=-1; next[0]=-1; while (j<m){ if (k==-1||p[j]==p[k]){ j++; k++; next[j]=k; } else k=next[k]; } } int kmp(){ int i=0,j=0; getnext(); while (i<n){ if (j==-1||s[i]==p[j]){ i++; j++; } else j=next[j]; if (j==m) return i; } return -1; } int main(){ int t; scanf ( "%d" ,&t); while (t--){ scanf ( "%d%d" ,&n,&m); for ( int i=0;i<n;i++) scanf ( "%d" ,&s[i]); for ( int i=0;i<m;i++) scanf ( "%d" ,&p[i]); if (kmp()==-1) printf ( "-1\n" ); else printf ( "%d\n" ,kmp()-m+1); } return 0; } |
以上就是KMP 算法的实例详解本站关于数据结构和算法的文章还有很多,希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!