【问题描述】

串的模式匹配算法BF的实现与应用。

【输入形式】

第一行输入主串s;

第二行输入模式串t;

输入串中均不包含空格字符。

【输出形式】

模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。

【样例输入1】

ababcabcacbab

ab

【样例输出1】

1 3 6 12

【样例输入2】

111113455113232342432432

11

【样例输出2】

1 2 3 4 10

【样例输入3】

fasdfdsfsadfdsdsagetgrdgfdgdf

2312

【样例输出3】

0

若 s= "abcdefg",t ="efg",则模式 t 在主串中的序号为5。

若 s = "abcdefgabc", t = "abc",如果指定从 s 串的第一个字符开始搜索,则序号为 1 ;如果改变搜索起始位置,如从第三个字符开始搜索,则序号为 8。

模式匹配的基本算法(BF算法)

BF算法(Brute Force)是实现模式匹配最简单,最直观的蛮力法。基本思想:按照从左自右的顺序,从主串第 start 个字符起和,模式串的第一个字符比较,以此类推,则继续逐个比较后续字符;否则从 start+1 个字符起重新比较。直到模式串 t 中的每个字符依次和主串 s 中的一个连续的字符序列相等,则匹配成功;否则匹配失败。

算法代码如下:

int index_bf(SqString *s,SqString *t,int start)
{int i=start-1,j=0;while(i<s->length&&j<t->length)   //依次比较主串s和子串t对应字符if(s->data[i]==t->data[j])   //对应字符相等,继续比较下一个字符{i++;j++;}else          //对应字符不相等,i和j回溯,开始下一趟比较{i=i-j+1;j=0;}if(j>=t->length)     //匹配成功,返回子串 t 在主串 s 中的位置return i-t->length+1;elsereturn 0;}

完整代码实现:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>#define INITSIZE 1000
#define INCRE 20
#define OK 1
#define ERROR 0typedef struct{char* data;int length,stringsize;
}SqString;//串初始化
int initString(SqString *S){S->data=(char *)malloc(INITSIZE*sizeof(char));if(!S->data)return 0;S->length=0;S->stringsize=INITSIZE;return 1;
}//串赋值
int strAssign(SqString *s, char *str ){int i=0;while(*str)s->data[i++]=* str++;s->data[i]='\0';s->length=i;return 1;
}
//基本模式匹配算法
int index_bf(SqString *s,SqString *t,int start)
{int i=start-1,j=0;while(i<s->length&&j<t->length)   //依次比较主串s和子串t对应字符if(s->data[i]==t->data[j])   //对应字符相等,继续比较下一个字符{i++;j++;}else          //对应字符不相等,i和j回溯,开始下一趟比较{i=i-j+1;j=0;}if(j>=t->length)     //匹配成功,返回子串 t 在主串 s 中的位置return i-t->length+1;elsereturn 0;}
int main(){//利用模式匹配算法完成子串查找SqString S;SqString T;int pos=1,tmp=0;char str[1000];if(initString(&S)&&initString(&T)){scanf("%s",&str);strAssign(&S,&str[0]);scanf("%s",&str);strAssign(&T,&str[0]);while(pos<S.length){pos=index_bf(&S,&T,pos);if(pos==0)break;printf("%d ",pos);tmp=1;pos++;}if(!tmp)printf("0");printf("\n");}return 0;
}

运行结果如下:

串的模式匹配(BF算法)相关推荐

  1. 模式匹配——BF算法

    1.BF算法(蛮力匹配): (1)从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则比较后续字符:否则,从主串S的第二个字符开始和模式T的第一个字符进行比较. (2)重复步骤(1),直到 ...

  2. 字符串的模式匹配--BF算法KMP算法

    BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...

  3. 数据结构:模式匹配BF算法

    一.BF算法原理 子串的定位操作通常称为串的模式匹配(其中T称为模式串).这是串的一个重要操作,许多软件,如果有编辑菜单的话,则其中必有查找子菜单项,这就是一个模式匹配问题.. Index(S, T, ...

  4. 算法笔记:简单的字符串模式匹配-BF算法

    字符串模式匹配是匹配字符串A中是否存在子串a,一般字符串的结尾为'\0',可以以此作为字符串结束的判定标准. 其过程原理图如下所示: 给出源代码: #include<stdio.h> #i ...

  5. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

  6. 从病毒感染检测谈串的模式匹配

    病毒感染检测:串的模式匹配 BF.KMP算法 在网络入侵检测.计算机病毒特征码匹配以及DNA序列匹配等应用中都需要进行串的模式匹配.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下 ...

  7. 数组与串,串的实现,KMP,BF算法

    数组是一种常用的数据结构,高级语言头提供了支持数组的基本操作,而且数组也是构成其他数据结构的重要组成. 数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列. 数组的任一个元素都可以用在数组 ...

  8. c语言实现bf算法的定位函数,数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

    数据结构c语言版严蔚敏清华大学出版社第四章串 模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则 ...

  9. 串的模式匹配(KMP算法)

    [问题描述] 串的模式匹配算法实现(KMP算法) [输入形式] 第一行输入主串s: 第二行输入模式串t: 第三行输入起始位置pos: [输出形式] 输出模式串t的next值(以空格分隔) 输出模式匹配 ...

最新文章

  1. Linux系统的CPU使用率和Load
  2. 算法与数据结构 - 滑动窗口
  3. [转载]Java web应用中的常见字符编码问题的解决方法
  4. ajax传递json数组php,怎么通过ajax传送json数组到php,并通过php将数据插入数据库
  5. C# 线程的定义和使用
  6. (转)淘淘商城系列——SSM框架整合之逆向工程
  7. python 随机数抽奖系统_python实现的简单抽奖系统实例
  8. ETCD for java_etcd-java使用
  9. linux创建新用户及权限
  10. 获取salve设备地址_商机 | 优选设备,让废金属加工更高效!
  11. 使用python实现日志功能
  12. NOIP模拟赛20161016R2
  13. JavaParser使用指南
  14. International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2018)
  15. 必知必会--HashMap容量细节
  16. shineblink BH1750光照强度传感器
  17. springboot整合mybatis,使用逆向工程和使用通用mapper的方式
  18. ccf公共钥匙盒python_CCF python 201709-2 公共钥匙盒
  19. c#如何wmf图片转换成png图片_C#图片格式转换(支持bmp/gif/jpeg/png/tiff/wmf文件)
  20. 为此计算机所有用户安装加载项,此网站需要运行以下加载项……如果您信任该网站和该加载项并允许运行该加载项...

热门文章

  1. 由汉诺塔引起的对递归的思考
  2. react native windows create bundle folder
  3. HTTP Response Splitting攻击探究 转
  4. 4.openSession() 、 getCurrentSession()与session上下文
  5. 通示jQuery实例方法,未DOM对象添加多个方法
  6. 重置一个画面大小的方法
  7. Android SVG 和 VectorDrawable 的基本知识
  8. 遍历某路径下的所有文件
  9. VS2013常用设置和其他
  10. ROS-SLAM仿真-hector