KMP未优化模板、

要理解KMP最重要的一点就是防止重复的回溯、

!!!很重要!!!很重要!!!很重要

要了解KMP可以去:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html

首先要生成模板串的next数组

 1 void getNext(char *p,int *next)
 2 {
 3     int j,k;
 4     next[0]=-1;
 5     j=0;
 6     k=-1;
 7     while(j<strlen(p)-1)
 8     {
 9         if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
10         {
11             j++;
12             k++;
13             next[j]=k;
14         }
15         else                   //p[j]!=p[k]
16             k=next[k];
17     }
18 }

然后来匹配、

 1 int KMPMatch(char *s,char *p)
 2 {
 3     int next[100];
 4     int i,j;
 5     i=0;
 6     j=0;
 7     getNext(p,next);
 8     while(i<strlen(s))
 9     {
10         if(j==-1||s[i]==p[j])
11         {
12             i++;
13             j++;
14         }
15         else
16         {
17             j=next[j];       //消除了指针i的回溯
18         }
19         if(j==strlen(p))
20             return i-strlen(p);
21     }
22     return -1;
23 }
原文地址:https://www.cnblogs.com/sasuke-/p/5162685.html