KMP算法是一种保证线性时间的字符串查找算法,由Knuth、Morris和Pratt三位大神发明,而算法取自这三人名字的首字母,因而得名KMP算法。
#include<string>
#include<iostream>
using namespace std;
void build_next(char pattern[],int n,int* next){
next[0] = 0; // next数组索引为0,没有元素可比,所以为0
int len = 0; // 共同前后缀的长度,默认为0
int i = 1; // 用来表示pattern数组的遍历索引位置
while (i < n)
{
if (pattern[i] == pattern[len])
{
len++;
next[i] = len;
i++;
}else{
len = next[len - 1];
if (len == 0)
{
next[i] = 0;
i++;
}
}
}
}
int kmp_search(char text[],char pattern[]){
int pattern_len = strlen(pattern);
int *next = new int(pattern_len);
//得到next数组
build_next(pattern, pattern_len, next);
int text_len = strlen(text);
int i = 0, j = 0;
while (i<text_len)
{
if (text[i] == pattern[j])
{
i++;
j++;
}else if (j > 0)
{
j = next[j - 1];
}else{
i++;
}
if (j == pattern_len)
{
return i - j;
}
}
return -1;
}
int main()
{
// 主串
char text[] = "ABABABCAB";
// 模式串
char pattern[] = "ABABC";
int res = kmp_search(text, pattern);
printf("%d", res);
return 0;
}
说明
写者水平有限,如有错误,欢迎斧正,感激不尽! e-mail: zhzjm8720@gmail.com