KMP 演示程序

KMP 演示程序

下面这个小程序,可以演示 KMP 的匹配过程。
一直没有真正理解这个算法,昨天看了下算法导论。才懂了。
确实是一个相当精辟,相当巧妙的算法。太牛逼了!

#include <stdio.h>
#include <string.h>

#define MAX_LEN 256

int tbl[MAX_LEN];
char *str = "abbbbbbb";
char *ptn = "bb";
char spc[MAX_LEN];

int main()
{
    int i, j;

    memset(spc, ' ', sizeof(spc));

    tbl[0] = 0;
    for (i = 1; ptn[i]; i++)  {
        for (j = tbl[i - 1]; j && ptn[j] != ptn[i]; j = tbl[j]);
        if (ptn[j] == ptn[i])
            j++;
        tbl[i] = j;
    }
    printf("table:\n");
    for (i = 0; ptn[i]; i++) 
        printf("  %c", ptn[i]);
    printf("\n");
    for (i = 0; ptn[i]; i++)
        printf("%3d", tbl[i]);
    printf("\n");

    j = 0;
    for (i = 0; str[i]; )  {
        printf("\nmatching #%d\n", i);
        printf("%s\n", str);
        fwrite(spc, 1, i - j, stdout);
        printf("%s\n", ptn);
        fwrite(spc, 1, i, stdout);
        printf("^\n");
    
        if (str[i] == ptn[j])  {
            i++;
            j++;
            printf("ok\n");
        } else  {
            if (j) 
                j = tbl[j - 1];
            else
                i++;
            printf("jumped to %d\n", j);
        }
        if (!ptn[j])
            printf("matched at %d\n", i);
    }

    return 0;
}



输出:
table:
  b  b
  0  1

matching #0
abbbbbbb
bb
^
jumped to 0

matching #1
abbbbbbb
 bb
 ^
ok

matching #2
abbbbbbb
 bb
  ^
ok
matched at 3

matching #3
abbbbbbb
 bb
   ^
jumped to 1

matching #3
abbbbbbb
  bb
   ^
ok
matched at 4

matching #4
abbbbbbb
  bb
    ^
jumped to 1

matching #4
abbbbbbb
   bb
    ^
ok
matched at 5

matching #5
abbbbbbb
   bb
     ^
jumped to 1

matching #5
abbbbbbb
    bb
     ^
ok
matched at 6

matching #6
abbbbbbb
    bb
      ^
jumped to 1

matching #6
abbbbbbb
     bb
      ^
ok
matched at 7

matching #7
abbbbbbb
     bb
       ^
jumped to 1

matching #7
abbbbbbb
      bb
       ^
ok
matched at 8

你可能感兴趣的:(KMP 演示程序)