C++ 简单实现KMP算法

509 阅读1分钟

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