KMP算法(下篇)

来源:互联网 发布:java foreach能倒序 编辑:程序博客网 时间:2024/06/06 19:54
/* * KMP 算法 * 要点如下: *      1 如何构建next表 *      2 如何利用next表进行模式匹配 *          指针位置的控制问题 * 数据结构上给的算法更精炼 */#include <cstdio>#include <cstring>void get_next(char *T, int next[]) {    int len = strlen(T);    int i = 0;    int j = -1;    next[0] = -1;    while (i < len-1) {        if (j==-1 || T[i] == T[j]) {            ++i, ++j;            if (T[i] != T[j]) next[i] = j;            else next[i] = next[j];        }        else j = next[j];    }}int Index_KMP(char *S, char *T, int pos) {    int len1 = strlen(S);    int len2 = strlen(T);    int *next = new int[len2];    get_next(T, next);    int i = pos-2;    int j = -1;    while (i < len1 && j < len2) {        if (j==-1 || S[i]==T[j]) {++i; ++j;}        else j = next[j];    }    delete [] next;    if (j >= len2) return i - len2;    else return 0;}int main() {    char *str1 = "ababaaababababcaaaa";    char str[] = "ababababca";    int pch = Index_KMP(str1, str, 1);    printf("%d\n", pch+1);    return 0;}
0 0
原创粉丝点击