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
请按任意键继续. . .

 

posted @ 2013-11-25 12:41  若。只如初见  阅读(276)  评论(0编辑  收藏  举报