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 }