串的匹配算法之朴素算法

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

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

代码一:

 

 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

串的匹配算法之朴素算法的相关文章

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

引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式则比較短小.典型的样例如文本编辑和DNA分析. 在进行文本编辑时,文本一般是一段话或一篇文章,而模式则经常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是非常高的. 模式匹配的朴素算法 最简单也最easy想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左

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

引言 字符串的模式匹配是一种常用的操作.模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都很大,而模式则比较短小.典型的例子如文本编辑和DNA分析.在进行文本编辑时,文本通常是一段话或一篇文章,而模式则常常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是很高的. 模式匹配的朴素算法 最简单也最容易想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左向右或从右向左一

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(上)

字符串的匹配的算法一直都是比较基础的算法,我们本科数据结构就学过了严蔚敏的KMP算法.KMP算法应该是最高效的一种算法,但是确实稍微有点难理解.所以打算,开这个博客,一步步的介绍4种匹配的算法.也是<算法导论>上提到的.我会把提到的四种算法全部用c/c++语言实现.提供参考学习.下图的表格,介绍了各个算法的处理时间和匹配时间.希望我写的比较清楚.如果不理解的,或者不对的,欢迎留言. 字符串匹配算法及其处理时间和匹配时间 算法 预处理时间 匹配时间 朴素算法 0 O((n-m+1)m) Rabi

串的匹配算法--C语言实现

串这种数据结构,使用是比较多的,但是它的一些方法在更高级的语言中,比如Java,Python中封装的比较完整了.在这里,我只写了串中使用最多的匹配算法,即串的定位操作.串的匹配算法常用的两种就是朴素匹配算法和KMP匹配算法.代码亲测,可直接执行. 1 #include<stdio.h> 2 3 /*字符串长度*/ 4 int StringLength(char *L) 5 { 6 int i = 0; //记录位置 7 int count = 0; //计数器,记录长度 8 while(L[i

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置.通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap.下面分析朴素搜索算法和KMP这两种方法并给出其实现.假设原字符T串长度N,子串P长度为M. 1.NAIVE-STRING-MATCHING. 朴素算法,该方法又称暴力搜索,

字符串匹配算法之sunday算法

本节介绍一下sunday算法,看一下sunday算法是如何做的呢 首先定义连个字符串 src:abcdacdaahfacabcdabcdeaa pattern:abcde 我们的目的就是在src串中查找pattern串是否存在,找的方法如下 1. 先左对齐,即从src[0].pattern[0]开始,进行依次比较,比较结果如下 arc[0]=pattern[0] 比较成功 arc[1]=pattern[1] 比较成功 arc[2]=pattern[2] 比较成功 arc[3]=pattern[3

字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)

布鲁特-福斯算法 简单的模式匹配算法是一种带回溯的匹配算法. 一.算法思想 从主串S的第pos个字符开始,和模式串T的第一个字符开始比较,如果相等就继续比较后续字符,如果不等,则从(回溯到)主串S的第pos+1个字符开始重新和模式串T进行比较,直到模式串T中的每一个字符和主串的每一个连续字符子序列全部相等,则称匹配成功,返回和T第一个字符相等的字符在主串S中的位置:或者主串中没有和模式串相等的字符序列,则称匹配不成功. 二.算法实现代码 设置i,j,start三个指示器: i--指向主串S中当前

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(中)

接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学公式,看的也会特别累.因此,打算从算导的第一题开始讲起.从习题入手,讲这个算法的思想. 例子:对模式 P = aabab构造出相应的字符串匹配自动机,并说明它在文本字符串T=aaababaabaababaab上的操作过程. 再讲这个例子之前,我们有必要先来了解一下自动机是什么意思? 有限自动机是什么