• KMP


    全部代码

      1 #include <stdio.h>
      2 #include <assert.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 
      6 int *GetNext(const char *match)
      7 {
      8     int *pNext = NULL;
      9     int i;
     10     int j;
     11 
     12     assert(match!=NULL);
     13 
     14     pNext = (int *)malloc(strlen(match)*sizeof(int));
     15     if(NULL == pNext)
     16     {
     17         printf("pNext空间分配失败!
    ");
     18         exit(-1);
     19     }
     20     i = 1;
     21     j = i-1;
     22     //起始位置
     23     pNext[0] = 0;
     24 
     25     while(i < strlen(match))
     26     {
     27         //当前字符与前面的next值所对应位置的值相等
     28         if(match[i] == match[pNext[j]])
     29         {
     30             pNext[i] = pNext[j]+1;
     31             ++i;
     32             j = i-1;
     33         }
     34         //前一个next值为0
     35         else if(0 == pNext[j])
     36         {
     37             pNext[i] = 0;
     38             ++i;
     39             j = i-1;
     40         }
     41         //不满足以上情况  向前跳转  再进行比较
     42         else
     43         {
     44             j = pNext[j] - 1;
     45         }
     46     }
     47 
     48     return pNext;
     49 }
     50 
     51 int KMP(const char *src, const char *match)
     52 {
     53     int i;
     54     int j;
     55     int *pNext = NULL;
     56 
     57     assert(src!=NULL && match!=NULL);
     58 
     59     pNext = GetNext(match);
     60     i = 0;
     61     j = 0;
     62 
     63     while(i<strlen(src) && j<strlen(match))
     64     {
     65         //相等  二者均向后移动
     66         if(src[i] == match[j])
     67         {
     68             ++i;
     69             ++j;
     70         }
     71         //不相等
     72         else
     73         {
     74             //匹配串已经回到起始位置 且仍不相等 主串向后移动
     75             if(0 == j)
     76             {
     77                 ++i;
     78             }
     79             //不满足上述情况  匹配串向前跳转
     80             else
     81             {
     82                 j = pNext[j-1];
     83             }
     84         }
     85     }
     86 
     87     if(0 == match[j])
     88     {
     89         return i - strlen(match);
     90     }
     91 
     92     return -1;
     93 }
     94 
     95 int main(void)
     96 {
     97     char *src = "ababcabcdef";
     98     char *match = "abc";
     99     printf("%d
    ", KMP(src, match));
    100 
    101     return 0;
    102 }
  • 相关阅读:
    用R语言实现对不平衡数据的四种处理方法
    用R语言实现对不平衡数据的四种处理方法
    Java学习——Applet画8个同心圆
    Java学习——Applet画8个同心圆
    Java学习——Applet写字符串(调字体)
    Java学习——Applet写字符串(调字体)
    ZOJ 2913 Bus Pass (近期的最远BFS HDU2377)
    机房结账功能分析
    数据结构记录--排序
    C#创建PDF文档
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7795116.html
Copyright © 2020-2023  润新知