Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68450
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:46:53

仅做练习记录使用。
模式串next值计算代码根据《算法导论》描述实现。
匹配过程自行实现。

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int * ComputeOverlay(const char* input){
  5.     if(input == NULL|| strlen(input)== 0)
  6.         return NULL;
  7.     int len = strlen(input);
  8.     int *overlay = (char*) malloc(sizeof(int)*len);
  9.     overlay[0] = 0;
  10.     int i = 1;
  11.     for(;i<len;i++){
  12.         overlay[i] = 0;
  13.         if(input[i] == input[overlay[i-1]]){
  14.             overlay[i] = overlay[i-1]+1;
  15.         }
  16.         else if(input[i] == input[0]){
  17.             overlay[i]++;
  18.         }
  19.     }
  20.     return overlay;

  21. }
  22. int KMP(const char* src, const char* pattern){
  23.     if(!src && !pattern) return -1;
  24.     int srclen = strlen(src);
  25.     int patternlen = strlen(pattern);
  26.     int *overlay = ComputeOverlay(pattern);
  27.     int srcIndex = 0;
  28.     int patternIndex = 0;
  29.     while(srcIndex<srclen && patternIndex < patternlen){
  30.         printf("compare src[%d] and pattern[%d] \n", srcIndex,patternIndex);
  31.         if(src[srcIndex] == pattern[patternIndex]){
  32.             srcIndex++;
  33.             patternIndex++;
  34.         }
  35.         else if(patternIndex == 0){
  36.             srcIndex ++;
  37.         }
  38.         else{
  39.             patternIndex = overlay[patternIndex-1];
  40.             printf("pattern back to %d \n",patternIndex);
  41.         }

  42.     }
  43.     if(patternIndex == patternlen){
  44.         return srcIndex - patternIndex;
  45.     }
  46.     return -1;
  47. }

  48. int main(){
  49.     char * pattern = "abababca";
  50.     int* overlay = ComputeOverlay(pattern);
  51.     int i = 0;
  52.     for(;i<strlen(pattern);i++){
  53.         printf("%c ",pattern[i]);
  54.     }
  55.     printf("\n");

  56.     for(i=0;i<strlen(pattern);i++){
  57.         printf("%d ",overlay[i]);
  58.     }

  59.     printf("\n");
  60.     printf("Found at %d \n", KMP("ababbabababcad", pattern));
  61. }

阅读(196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~