模式串匹配,kmp

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include<string.h>
#define MAXSTRLEN 255   /* 可以在255以内定义最大串长 */
typedef  char SString[MAXSTRLEN + 1];  /* 0号单元存放串的长度 */
void get_next(SString T, int next[]);
void get_nextval(SString T, int nextval[]);
int Index(SString S, SString T, int pos) {
    int i = pos; int j = 1;
    while (i <= S[0] && j <= T[0]) {
        if (S[i] == T[j]) {++i;  ++j;} //继续比较后继字符
        else {i = i - j + 2;  j = 1;}  //指针后退重新开始匹配
    }
    if (j > T[0]) return i - T[0];
    else return 0;
}

int Index_KMP_1(SString S, SString T, int pos) {
    int i = pos; int j = 1;
    int *next = (int *)malloc((T[0] + 1) * sizeof(int));
    get_next(T, next);
    while (i <= S[0] && j <= T[0]) {
        if (j == 0 || S[i] == T[j]) {++i;  ++j;} //继续比较后继字符
        else j = next[j];                        //模式串向右移动
    }
    free(next);
    if (j > T[0]) return i - T[0];               //匹配成功
    else return 0;
}

void get_next(SString T, int next[]) {
    int i = 1, j = 0;    next[1] = 0;
    while (i < T[0]) {
        if (j == 0 || T[i] == T[j]) {++i;  ++j; next[i] = j;}
        else j = next[j];
    }
}

int Index_KMP_2(SString S, SString T, int pos) {
    int i = pos; int j = 1;
    int *nextval = (int *)malloc((T[0] + 1) * sizeof(int));
    get_nextval(T, nextval);
    while (i <= S[0] && j <= T[0]) {
        if (j == 0 || S[i] == T[j]) {++i;  ++j;}    //继续比较后继字符
        else j = nextval[j];                        //模式串向右移动
    }
    free(nextval);
    if (j > T[0]) return i - T[0];                  //匹配成功
    else return 0;
}

void get_nextval(SString T, int nextval[]) {
    int i = 1;   nextval[1] = 0;  int j = 0;
    while (i < T[0]) {
        if (j == 0 || T[i] == T[j]) {
            ++i;  ++j;
            if (T[i] != T[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        }
        else j = nextval[j];
    }
}
/*
样例
s:ababcabcacbab
  t:abcac           */
int main(){
    SString S, T;
    scanf("%s",S+1);
    S[0]=strlen(S+1);
    S[S[0]+1]='';

    scanf("%s",T+1);
    T[0]=strlen(T+1);
    T[T[0]+1]='';
    printf("Index: %d
", Index(S, T, 1));//暴力模式匹配方法
    printf("Index_KMP_1: %d
", Index_KMP_1(S, T, 1));//KMP算法
    printf("Index_KMP_2: %d
", Index_KMP_2(S, T, 1));//KMP优化算法
}
原文地址:https://www.cnblogs.com/13224ACMer/p/5037883.html