模式串匹配,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]='\0';

    scanf("%s",T+1);
    T[0]=strlen(T+1);
    T[T[0]+1]='\0';
    printf("Index: %d\n", Index(S, T, 1));//暴力模式匹配方法
    printf("Index_KMP_1: %d\n", Index_KMP_1(S, T, 1));//KMP算法
    printf("Index_KMP_2: %d\n", Index_KMP_2(S, T, 1));//KMP优化算法
}

 

转载于:https://www.cnblogs.com/13224ACMer/p/5037883.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值