zoukankan      html  css  js  c++  java
  • 模式串匹配,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优化算法
    }
  • 相关阅读:
    Hoder.js介绍
    vim折叠方法
    tensorflow最基础分类实例--iris分类
    语音识别GMM-HMM
    亨元模式
    责任链模式
    命令模式
    策略模式
    工厂模式
    Java高并发程序设计(十)--无锁
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5037883.html
Copyright © 2011-2022 走看看