串的匹配算法之朴素算法

  朴素算法,即不对子串进行预处理。

  利用朴素算法我们可以在主串中寻找子串出现的次数。

代码一:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int Count(char *p, char *q)
 5 {
 6     int i, k, num = 0;
 7     unsigned int j;
 8     for (i = 0; p[i] != ''; i++)
 9     {
10         for (k = i, j = 0; p[k] == q[j] && j < strlen(q); j++, k++)
11             if (j == strlen(q) - 1)
12                 num++;
13     }
14     return num;
15 }
16 int main()
17 {
18     char a[50], b[10];
19     int n;
20     printf("请输入主串: ");
21     gets_s(a,50);
22     printf("请输入子串: ");
23     gets_s(b,10);
24     n = Count(a, b);
25     printf("子串在主串中出现了%d次", n);
26 
27 return 0;
28 
29 }

  代码二:

定义两个指针p,q;p指向主串首地址,q指向子串首地址。

如果对应的字符相等,那么++p,++q,即两个指针都向后移一个单位再继续比较*p和*q,

否则q回到子串的首地址,只把指针p向后移动一个单位。

依次类推,如果*q==‘’,说明子串已经终止,子串在主串中出现的次数加1,直到主串终止为止。

  

 1 #include <stdio.h>
 2 
 3 
 4 int Count(char  *str, char  *substr)
 5 {
 6 int n = 0;
 7 char *p, *q;
 8 
 9 while (*str)
10 {
11 p = str;
12 q = substr;
13 while (*q)
14 {
15 if (*p == *q)
16 {
17 ++p;
18 ++q;
19 }
20 else
21 {
22 break;
23 }
24 
25 }
26 if (*q == '' )
27 {
28 ++n;
29 }
30 ++str;
31 }
32 return n;
33 }
34 
35 int
36 main()
37 {
38 char str[50], substr[10];
39 int n;
40 printf("请输入主串:");
41 gets_s(str);
42 printf("请输入子串:");
43 gets_s(substr);
44 n = Count(str, substr);
45 printf("子串在主串中出现了%d次", n);
46 
47 return 0;
48 }

 

原文地址:https://www.cnblogs.com/mwq1024/p/10581689.html