自写KMP模板

 1 int* Getnext(char *p,int len_p){//p为模式串 
 2     int *Next = new int[len_p];
 3     Next[0] = -1;
 4     int j = -1,i=0;
 5     while(i < len_p){//自身与自身匹配 
 6         while(j != -1&&p[j]!=p[i])//移动匹配串 
 7             j = Next[j];
 8         j+=1;
 9         Next[++i] = j; 
10     }
11     return Next;
12 }
13 vector<int>* Kmp(char *s,char *p,int len_s,int len_p){//s为主串,p为匹配串 
14     int *Next = Getnext(p,len_p);//求得Next数组    
15     int j = 0;//j为匹配串匹配到的位置
16     vector<int>* ans = new vector<int>();//ans为匹配到的主串的开头下标位置 
17     for(int i=0;i < len_s;i++){
18         while(j != -1 && s[i] != p[j])
19             j = Next[j];
20         j+=1;
21         if(j == len_p){//匹配串匹配完毕
22             ans->push_back(i - len_p + 1);
23             j = Next[j];//j退回到Next[j] 
24         }
25     } 
26     return ans;
27 }

 

posted @ 2018-03-16 20:53  晓风微微  阅读(136)  评论(0编辑  收藏  举报