zoukankan      html  css  js  c++  java
  • kmp matching

      看了算法导论,有点迷糊。照着为代码敲出来的C。数组都前移了一位,就实现 了。

      主要是计算前缀数组的有点抽象。简单的说就是,next[j]表示当模式串t中第j个字符与主串中相应字符(即Si)不相等时,模式串中需重新和主串中该字符Si进行比较的字符位置k,即下次开始比较Si与Tk。我们希望子串能尽量快的右移,当出现不匹配的情况时。

     

     

    View Code
    #include<stdio.h>
    #include<string.h>
    #include <stdlib.h>

    void KMP(char *T, char *P);
    int *Compute(char *p);

    int main()
    {
    char t[100], p[100];
    scanf("%s %s", t, p);
    KMP(t,p);
    return 0;
    }

    void KMP(char * t, char * p)
    {
    int i, n, m, q, *next;
    n = strlen(t);
    m = strlen(p);
    next = Compute(p);
    q = 0;
    for(i = 0; i < n; i++)
    {
    while(q > 0 && p[q] != t[i])
    q = next[q - 1];
    if(p[q] == t[i])
    {
    q++;
    }
    if(q == m )
    {
    printf("find a match in the position %d\n",i-m+2);
    //printf("%s\n",&t[i-m+1]);
    q = next[q-1];
    }
    }
    }

    int * Compute(char *p)
    {
    int m,k,q,*next;
    next = (int *)malloc(100*sizeof(int));
    m = strlen(p);
    next[0] = 0;
    k = 0;
    for(q = 1; q < m; q++)
    {
    while(k > 0 && p[k] != p[q])
    {
    k = next[k - 1];
    }
    if(p[k] == p[q])
    k++;
    next[q] = k;

    // printf("p[%d] = %c p[%d] = %c k = %d q = %d next[%d] = %d\n", k, p[k], q, p[q], k,q,q,next[q]);

    }

    return next;
    }



  • 相关阅读:
    java中文api 安装和引入eclipse
    【JAVA学习笔记】Java中的static关键字解析
    终于做好了JDBC在java和sql 2005之间的连接了 ,快哭了
    CF 5 A. Chat Server's Outgoing Traffic
    NYOJ 16 矩形嵌套
    poj 1061 青蛙的约会
    nefu 2 猜想
    nefu 120 梅森素数
    nefu 118 n!后面有多少个0
    nefu 117 素数个数的位数
  • 原文地址:https://www.cnblogs.com/genslow/p/2433855.html
Copyright © 2011-2022 走看看