字符串匹配,KMP算法

KMP的详解见:https://segmentfault.com/a/1190000008575379

主要难点在于Next数组的理解,KMP是不需要回溯的匹配算法。

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 #define MAXSIZE 100
 5 using namespace std;
 6 /*为方便理解算法,使用全局变量减少参数传递*/
 7 string T,P;
 8 vector<int> Next(MAXSIZE);
 9 
10 void getNext();//获取带匹配字符串P的Next数组 
11 int KMP();//返回匹配结果,若P为T的子串则返回匹配成功的T的下标,反之返回-1 
12 
13 int main()
14 {
15     cout<<"Text : ";
16     getline(cin,T);//读取整行字符串,包括空格 
17     cout<<"Part : ";
18     getline(cin,P);
19     int index=KMP();
20     printf("index = %d
",index);
21     return 0;
22 }
23 
24 int KMP()
25 {
26     int i=0,j=0;
27     int n=T.size(), m=P.size();//s.size()的返回值是unsigned类型,必须转为整型变量 
28     getNext();
29     while(i<n&&j<m){
30         if(j==-1||T[i]==P[j]){
31             i++;
32             j++;
33         }
34         else{
35             j=Next[j];
36         }
37 //        printf("i=%d, j=%d
",i,j); //用于查看匹配过程 
38     }
39     
40     if(j==m) return i-j;
41     else return -1;
42 }
43 
44 void getNext()
45 {
46     int i=0,j=-1;
47     Next[0]=-1;
48     while(i<P.size()-1){
49         if(j==-1||P[i]==P[j]){
50             i++;
51             j++;
52         //    Next[i]=j; 
53             if(P[i]!=P[j]||j==0)
54                 Next[i]=j;
55             else
56                 Next[i]=Next[j];
57         }
58         else{
59             j=Next[j];
60         }
61     }
62 }
原文地址:https://www.cnblogs.com/yinhao-ing/p/10523233.html