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 算法的实例详解本站关于数据结构和算法的文章还有很多,希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!