Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1559293
  • 博文数量: 327
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 21:28
个人简介

东黑布衣,流浪幽燕。 真诚善良,值得信赖。

文章分类

全部博文(327)

我的朋友

分类: BSD

2007-02-02 14:04:41


Code Begin
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. /* 该函数求最长公共前后缀 */
  6. void prefix_table(char ptrn[], int prefix[], int n)
  7. {
  8.    int len=0;
  9.    int i=1;
  10.    prefix[0]=0;
  11.    while(i<n){
  12.       printf("i = %d, len = %d\n",i,len);
  13.       if(ptrn[i]==ptrn[len]){
  14.          len++;
  15.          prefix[i]=len;
  16.          i++;
  17.       }else{
  18.          if(len>0){
  19.             len=prefix[len-1];
  20.          }else{
  21.             prefix[i]=len;/* 这里的len其实就是0,所以也可以直接写0 */
  22.             i++;
  23.          }
  24.       }
  25.    }
  26. }
  27. /* 经过move之后,则在prefix[i]表示的是i之前的字符串最长公共前后缀的长度 */
  28. void move_prefix_table(int prefix[],int n)
  29. {
  30.    int i;
  31.    for(i=n-1;i>0;i--){
  32.       prefix[i]=prefix[i-1];
  33.    }
  34.    prefix[0]=-1;
  35. }

  36. void kmp_search(char text[], char ptrn[])
  37. {
  38.    int n=strlen(ptrn);
  39.    int m=strlen(text);
  40.    int i=0;
  41.    int j=0;
  42.    int* prefix=(int *)malloc(sizeof(int)*n);
  43.    prefix_table(ptrn,prefix,n);
  44.    move_prefix_table(prefix,n);

  45.    /* text[i] len(text)=m */
  46.    /* ptrn[j] len(ptrn)=n */
  47.    while(i<m){
  48.       if(j==n-1 && text[i]==ptrn[j]){
  49.          printf("Found pattern at %d\n", i-j);
  50.          j=prefix[j];/* 继续寻找下一个相同的匹配, 如果只需找一个那么可以break */
  51.       }
  52.       if(text[i]==ptrn[j]){
  53.          i++;j++;
  54.       }else{
  55.          /* 从相同的前缀后开始比较,因为后缀和前缀相同,后缀相同了,前缀必然相同 */
  56.          j=prefix[j];
  57.          if(j==-1){
  58.             i++;j++;
  59.          }
  60.       }
  61.    }
  62. }

  63. int main(int argc, char* argv[])
  64. {
  65.    /* 对于本例prefix[]-1 0 0 1 2 0 1 2 3 */
  66.    char ptrn[]="ABABCABAA";
  67.    char text[]="ABABABCABAABABABAB";

  68.    kmp_search(text,ptrn);
  69. #if 0
  70.    int prefix[9];
  71.    int n=9;
  72.    int i;
  73.    prefix_table(ptrn, prefix,9);
  74.    move_prefix_table(prefix,n);
  75.    for(i=0;i<n;i++)
  76.       printf("%d ",prefix[i]);
  77.    printf("\n");
  78. #endif
  79.    return 0;
  80. }
  81. /*
  82. Found pattern at 2
  83. */
Code end


阅读(1981) | 评论(6) | 转发(0) |
0

上一篇:游子夜歌

下一篇:荷之韵

给主人留下些什么吧!~~

zhln2018-04-08 16:34:40

测测你的出生精灵