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