KMP算法(基于PMT数组)

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 }

猜你喜欢

转载自www.cnblogs.com/TYXmax/p/10978523.html
今日推荐