1. 程式人生 > >字符串匹配,KMP算法

字符串匹配,KMP算法

next() sign lin span 匹配 turn string com clas

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\n",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\n",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 }

字符串匹配,KMP算法