KMP算法

kmp算法实现:

#include <iostream>
using namespace std;

void kmp_getnext(char *partten, int *next) {
    int m = strlen(partten);
    int i = 0, j = -1;
    next[i] = j;     
    while ( i < m + 1 ) {
        while ( j >= 0 && partten[i] != partten[j] ) //表示第i + 1个元素不等于第j + 1个元素
            j = next[j];                 //前j个字符partten[0---(j-1)]的最大前缀存放在next[j]中
        i++;
        j++;
        next[i] = j;
    }
}

void kmp_search(char *text, char *partten, int *next) {
    int n = strlen(text);
    int m = strlen(partten);
    int i = 0;
    int j = 0;
    while ( i < n) {
        while ( j >= 0 && text[i] != partten[j] )
            j = next[j];
        i++;
        j++;
        if ( j == m ) {
            printf("%d\t", i - j + 1);
            j = next[j];
        }
    }


}
int main(void) {
    char *text = "aababaababacb";
    char *partten = "ababacb";
    int m = strlen(partten);
    int *next = (int *)malloc((m + 1) * sizeof(int));
    kmp_getnext(partten, next);
    kmp_search(text, partten, next);

    return 0;
}


你可能感兴趣的:(KMP算法)