串的匹配算法之朴素算法

Posted mwq1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串的匹配算法之朴素算法相关的知识,希望对你有一定的参考价值。

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

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

代码一:

 

 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 }

 

 

 

以上是关于串的匹配算法之朴素算法的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

串的匹配:朴素匹配&amp;KMP算法

串的定义及朴素的模式匹配算法

图解字符串的朴素模式匹配算法

4.2 串的模式匹配算法

KMP子串查找算法