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