字符串的匹配BF法

  1 #include <stdio.h>  
2 #include<string.h>
3 int main()
4 {
5 int i,k,l1,l2,ii,j,leap;
6 char s1[1001],s2[1001];
7 while(gets(s1)!=NULL)
8 {
9 gets(s2);
10 l1=strlen(s1);
11 l2 = strlen(s2);
12 leap =0;
13
14 for(i= 0;i <= l1-l2;i++) //i是可以到l1-l2的它在l1-l2上在做一次比较
15 {
16 ii = 0;j = 0;
17 while(ii < l1&&j < l2)
18 {
19 if(s1[ii] == s2[j])
20 {
21 ii++;j++;
22 }
23 else
24 {
25 ii = ii-j+1;j = 0; //ii从开始有相等的地方再次向后移动
26 }
27 if(j == l2) //而不是l2-1
28 {
29 leap = 1;break;
30 }
31 else
32 leap=0;
33
34 }
35 if(leap)
36 break;
37
38
39 }
40 if(leap == 0)
41 {
42 printf("NO\n");
43 }
44 else
45 {
46 printf("YES\n");
47 }
48 }
49 }
50 //算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法
51
52 #include <stdio.h>
53 #include <stdlib.h>
54 #define MAXL 255
55 #define FALSE 0
56 #define TRUE 1
57
58 typedef int Status;
59 typedef unsigned char SString[MAXL+1];
60
61 //生成一个其值等于串常量strs的串T
62 void StrAssign(SString &T, char *strs)
63 {
64 int i;
65 T[0] = 0; //0号单元存储字串长度
66 for(i = 0; strs[i]; i++) //用数组strs给串T赋值
67 T[i+1] = strs[i];
68 T[0] = i;
69 }
70
71 //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0
72 int Index(SString S, SString T, int pos)
73 {
74 int i = pos, j = 1;
75 while(i <= S[0] && j <= T[0])
76 {
77 if(S[i] == T[j]) //继续比较后面的字符
78 {
79 i++;
80 j++;
81 }
82 else //指针回退,重新开始匹配
83 {
84 i = i -j + 2;
85 j = 1;
86 }
87 }
88 if(j > T[0])
89 return i - T[0];
90 else
91 return 0;
92 }
93
94
95 int main()
96 {
97 SString S, T;
98 int m;
99 char strs1[MAXL]; //建立主串S
100 char strs2[MAXL]; //建立模式串T
101 printf("请输入主串和子串:\n");
102 printf("主串S: ");
103 scanf("%s", strs1);
104 printf("子串T: ");
105 scanf("%s", strs2);
106
107 StrAssign(S, strs1);
108 StrAssign(T, strs2);
109
110 m = Index(S, T, 1);
111 if(m)
112 printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m);
113 else
114 printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2);
115 return 0;
116 }
原文地址:https://www.cnblogs.com/0803yijia/p/2364044.html