BF-KMP 算法

  1 #define _CRT_SECURE_NO_WARNINGS

  2 #include<stdio.h>

  3 #include<stdlib.h>

  4 #include<string.h>

  5 

  6 #define MAX_SIZE 255    //    定义字符串的最大长度

  7 

  8 typedef unsigned char SString[MAX_SIZE];    //数组第一个保存长度

  9 //BF

 10 int BFMatch(char *s,char *p)

 11 {

 12     int i,j;

 13     i=0;

 14     while(i < strlen(s))

 15     {

 16         j=0;

 17         while(s[i]==p[j]&&j < strlen(p))

 18         {

 19             i++;

 20             j++;

 21         }

 22         if(j==strlen(p))

 23             return i-strlen(p);

 24         i=i-j+1;                //指针i回溯

 25     }

 26     return -1;    

 27 }

 28 //getNetx

 29 void getNext(char *p,int *next)

 30 {

 31     int j,k;

 32     next[0]=-1;

 33     j=0;

 34     k=-1;

 35     while(j < strlen(p)-1)

 36     {

 37         if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]

 38         {

 39             j++;

 40             k++;

 41             next[j]=k;

 42         }

 43         else 

 44         {                  //p[j]!=p[k]

 45             k=next[k];

 46         }

 47     }

 48 }

 49 

 50 //KMP

 51 int KMPMatch(char *s,char *p)

 52 {

 53     int next[100];

 54     int i,j;

 55     i=0;

 56     j=0;

 57     getNext(p,next);

 58     while(i < strlen(s))

 59     {

 60         if(j==-1||s[i]==p[j])

 61         {

 62             i++;

 63             j++;

 64         }

 65         else

 66         {

 67             j=next[j];       //消除了指针i的回溯

 68         }

 69         if(j==strlen(p))

 70         {

 71             return i-strlen(p);

 72         }

 73     }

 74     return -1;

 75 }

 76 

 77 int main()

 78 {

 79     int a, b;

 80     char s[MAX_SIZE], p[MAX_SIZE];

 81 

 82     printf("请输入模式串:");

 83     scanf("%s", &s);

 84     printf("请输入子串:");

 85     scanf("%s", &p);

 86 

 87     a = BFMatch(s, p);

 88     b = KMPMatch(s, p);

 89 

 90     if(a != -1)

 91     {

 92         printf("使用BF算法:%d\n", a);

 93     }

 94     else

 95     {

 96         printf("未匹配\n");

 97     }

 98 

 99     if(b != -1)

100     {

101         printf("使用KMP算法:%d\n", a);

102     }

103     else

104     {

105         printf("未匹配\n");

106     }

107 

108     system("pause");

109 }
请输入模式串:lalalalalaaaa

请输入子串:lalaa

使用BF算法:6

使用KMP算法:6

请按任意键继续. . .

 

你可能感兴趣的:(KMP)