字符串匹配之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;
}
浙公网安备 33010602011771号