朴素算法,即不对子串进行预处理。
利用朴素算法我们可以在主串中寻找子串出现的次数。
代码一:
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] != ‘\0‘; 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==‘\0’,说明子串已经终止,子串在主串中出现的次数加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 == ‘\0‘ ) 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
时间: 2024-10-17 13:39:28