KMP算法可以找出在t串中第一次出现p串的位置下标,时间复杂度为O(n+m)
首先对于模式串建立PMT数组:时间复杂度O(n)
1.i号与j号的字符不同并且j==0,写0并且向后移动i
2.i号与j号的字符相同,写j+1同时i向后移动,j也向后移动
3.i号与j号的字符不同并且j!=0,找j之前字符对应的PMT数组的值赋给j
(PMT整体向右移动一位,第一位用-1代替可以得到next数组,至于为什么我没有研究)
接下来就是KMP算法了
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int pmt[10]; 5 void GetPMT(char *p){ 6 pmt[0]=0; 7 for(int j=0,i=1;i<=strlen(p)-1;){ 8 if(p[j]!=p[i]&&j==0){ 9 pmt[i]=0; 10 i++; 11 } 12 else if(p[j]==p[i]){ 13 pmt[i]=j+1; 14 i++; 15 j++; 16 } 17 else if(p[j]!=p[i]&&j!=0){ 18 j=pmt[j-1]; 19 } 20 } 21 } 22 int KMP(char*t,char*p){ 23 GetPMT(p); 24 for(int i=0,j=0;i<=strlen(t)-1;){ 25 if(t[i]==p[j]){ 26 if(j==strlen(p)-1) return i-j; 27 i++; 28 j++; 29 } 30 else{ 31 j=pmt[j-1]; 32 } 33 } 34 return -1; 35 } 36 int main(){ 37 char pattern[10];//子字符串 38 char target[100];//目标字符串 39 cin>>target>>pattern; 40 cout<<KMP(target,pattern)<<endl; 41 }