字符串匹配之KMP算法

想到字符串匹配,我们一下子就会想到暴力匹配,但是这种暴力匹配的算法时间复杂度太高,顾前人便发挥聪明才智,发明了KMP算法。

KMP算法需要两步:

1)构造next数组    next[j] = k的含义是当j位置失配时,指针跳到k位置处

2)利用next数组进行字符串匹配

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int* create_next(char * src){
   int* next = (int*)malloc(sizeof(int)*strlen(src));
   next[0] = -1;
   if(strlen(src) == 1)
      return next;
   next[1] = 0;
   int j = 1;
   int k = next[j];
   while(j < strlen(src)-1){
      if(k < 0||src[j] == src[k]){
         next[++j] = next[++k];
      }else{
         k = next[k];
      }
   }
   return next;
}

int KMP(char* s,char* p){
   int slength = strlen(s);
   int plength = strlen(p);
   if(slength <= 0|| plength <= 0) return -1;
   if(plength > slength) return -1;
 
   int i = 0;
   int j = 0;
   //创建next数组
   int* next = create_next(p);
 
   while(i < slength){
      if(s[i] == p[j]||j < 0){
         i++;
         j++;
      }else{
         j = next[j];  
      }
      if(j == plength) return i-j;
   }
 
   return -1;
}

int main(void){
   cout << KMP("baabcdeadabc","abc") << endl;
   return 0;
}

posted @ 2020-02-29 10:54  宝宝的你叔叔  阅读(118)  评论(0)    收藏  举报