1 /* 核心代码 */
2
3
4
5 #include<iostream>
6 #include<string>
7
8 using namespace std;
9 const int N=100005;
10
11 void getNext(string p,int *next)
12 {
13 int j,k;
14 next[0]=-1;
15 j=0;
16 k=-1;
17 while(j<p.length()-1)
18 {
19 if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k]
20 {
21 j++;
22 k++;
23 next[j]=k;
24 }
25 else //p[j]!=p[k]
26 k=next[k];
27 }
28 }
29
30
31 int KMPMatch(string s,string p)
32
33
34 {
35 int next[100];
36 int i,j;
37 i=0;
38 j=0;
39 getNext(p,next);
40 while(i<s.length())
41 {
42 if(j==-1||s[i]==p[j])
43 {
44 i++;
45 j++;
46 }
47 else
48 {
49 j=next[j]; //消除了指针i的回溯
50 }
51 if(j==p.length())
52 return i-p.length();
53 }
54 return -1;
55 }