串的模式匹配算法之BF算法
与线性表相似,串也有两种基本存储结构,顺序存储和链式存储。但考虑到存储效率和算法的方便性,串多采用顺序存储结构。
1、串的顺序存储
1)串的定长顺序存储结构
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。合理
这种定义方式是静态的,在编译时刻就确定了串空间的大小。而大多数情况下,串的操作是以串的整体形式参与的,串变量之间的长度相差较大,在操作中串值长度的变化也较大,这样为串变量设定固定大小的空间不尽合理。因此最好是根据实际需要,在程序执行过程中动态地分配和释放字符数组空间。
2)串的堆式顺序存储结构
在C语言中,存在一个称之为“堆”(Heap)的自由存储区,可以为每个新产生的串动态分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,同时为了以后处理方便,约定串长也作为存储结构的一部分(也可以通过调用size()函数来直接获取串长)。
2、串的链式存储
顺序串的插入和删除操作不方便,需要移动大量的字符。因此,可采用单链表方式存储串。由于串结构的特殊性一一结构中的每个数据元素是一个字符,则在用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个字符。例如,图4.3( a )所示为结点大小为4(即每个结点存放4个字符)的链表,图4。3( b )所示为结点大小为1的链表。当结点大小大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上“#”或其他的非串值字符(通常“#”不属于串的字符集,是一个特殊的符号)。
为了便于进行串的操作,当以链表存储串值时,除头指针外,还可附设一个尾指针指示链表中的最后一个结点,并给出当前串的长度。
串的模式匹配算法
子串的定位运算通常称为串的模式匹配或串匹配。此运算的应用非常广泛,比如在搜索引擎、拼写检查、语言翻译、数据压缩等应用中,都需要进行串匹配。
串的模式匹配设有两个字符串S和T,设S为主串,也称为正文串,本人所写代码把它叫做母串;设T为子串,也称为模式。在母串中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的第一个字符在母串S中出现的位置。
著名的模式匹配算法有BF算法和KMP算法。
BF(Brute-Force)算法
最简单直观的模式匹配算法是BF算法。
模式匹配不一定从母串的第一个位置开始,可以指定母串中查找的起始位置pos。
下图是BF算法的匹配过程
C++代码
#include<iostream>
using namespace std;
int BF(string S,string T,int pos)
{int i = pos;int j = 1;while( i <= S.size() && j <= T.size() ){if( S[i-1] == T[j-1] ){i++;j++;}else{i = i-j+2;//i为母串S的匹配失败的位置,j为模式串S的匹配失败的位置,i-j为S第一次匹配位置之前的长度,//+2的原因是一个1是本次匹配的开始位置 ,另一个1是下一次匹配的开始位置。 j = 1;//模式串的下一次匹配开始位置依旧是第一个字符 }}if( j > T.size() )return i - T.size();return 0;
}
int main()
{int pos;string S,T;while( true ){cout<<"请输入母串:";cin>>S;cout<<"请输入模式串:";cin>>T;cout<<"请输入在母串中开始寻找的位置(小于等于"<<S.size()<<"):";cin>>pos;while ( pos > S.size() ){cout<<"请重新输入在母串中开始寻找的位置(小于等于"<<S.size()<<"):";cin>>pos;}cout<<"模式串在自母串第 "<<pos<<" 位开始出现的位置为 "<<BF(S,T,pos)<<endl<<endl;}
}
结果
请输入母串:ksfhseurhnzfkkkksgbn,csehkbnvjrvbnsjehjvfl
请输入模式串:cs
请输入在母串中开始寻找的位置(小于等于42):43
请重新输入在母串中开始寻找的位置(小于等于42):44
请重新输入在母串中开始寻找的位置(小于等于42):42
模式串在自母串第 42 位开始出现的位置为 0请输入母串:kajfdesaiefhkebxfucsnfeksnc
请输入模式串:csn
请输入在母串中开始寻找的位置(小于等于27):3
模式串在自母串第 3 位开始出现的位置为 19请输入母串:krsuebrcexxxxxs,cfnu,n,bnrusnumfsbc
请输入模式串:x
请输入在母串中开始寻找的位置(小于等于35):1
模式串在自母串第 1 位开始出现的位置为 10请输入母串:krsuebrcexxxxxs,cfnu,n,bnrusnumfsbc
请输入模式串:x
请输入在母串中开始寻找的位置(小于等于35):10
模式串在自母串第 10 位开始出现的位置为 10请输入母串:krsuebrcexxxxxs,cfnu,n,bnrusnumfsbc
请输入模式串:x
请输入在母串中开始寻找的位置(小于等于35):11
模式串在自母串第 11 位开始出现的位置为 11请输入母串:sdhfnmkexilsncfxmaiqwncfxi
请输入模式串:mai
请输入在母串中开始寻找的位置(小于等于26):1
模式串在自母串第 1 位开始出现的位置为 17请输入母串:
BF算法的代码还是比较容易看懂的,所以这里就不过多解释,有问题可以评论留言。
欢迎各位大佬们指导小弟!
转载需说明!
串的模式匹配算法之BF算法相关推荐
- 4.3串的模式匹配算法(BF算法)
4.3.1 求子串位置的定位函数Index(S,T,pos) 子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法. 算法4.5: 下面是 ...
- 字符串匹配算法(BF算法KMP算法)
字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...
- 《数据结构》—— 串的模式匹配算法
串的模式匹配 一.简单的模式匹配算法(BF算法) 二.KMP算法 一.简单的模式匹配算法(BF算法) 在实际应用中我们常常能用到类似串的模式匹配,也称子串的定位操作.例如单词查找,百度搜索都是串的模式 ...
- 第四章:2.串 -- 串的模式匹配算法(KMP)
前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...
- 数据结构笔记(十四)-- 串的模式匹配算法
串的模式匹配算法 一.普通模式匹配算法 1.算法解析 普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果. 例如,使用普通模式匹配算法判断串 T( ...
- 串的模式匹配算法(超详细)
串的模式匹配 1 简单的模式匹配算法 2 KMP算法 3 KMP算法改进 4 时间复杂度比较 1 简单的模式匹配算法 思想: 将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串或所 ...
- 数据结构:KMP算法 串的模式匹配算法(全网最详细)
目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理 接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...
- 串的模式匹配算法1-BF算法
目录 1.BF算法 1.1匹配过程: 1.2直接使用string方法编写BF算法: 1.3编写SString来编写BF算法 子串的定位运算通常称为串的模式匹配或是串匹配.著名的算法有BF算法和KMP算 ...
- 【考研】串的模式匹配算法——KMP算法(含真题)
前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...
- 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)
[算法流程] 朴素的字符串匹配算法即暴力匹配算法(BF,Brute Force),其本质是暴力枚举,主要特点有: 没有预处理阶段: 滑动窗口总是后移 1 位: 对模式中的字符的比较顺序不限定,可以从前 ...
最新文章
- 基于Web Services建立Asp与Asp.Net之间Session数据桥的应用研究
- one order callback frequency
- 爬虫遇到路径转换的解决方案
- linux文件夹权限_五分钟搞定 Linux 文档全部知识,就看这篇文章
- 哨兵1号(sentinel 1)数据各参数介绍
- java 万年历_java实现万年历
- iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?
- AI自动剪辑生成视频探索实践
- 【appium】appium自动化入门之基本参数完整版(67个appium基本参数和关键字)
- Windows10无法完成更新 正在撤销更改怎么解决转载
- LCA 天天爱跑步
- 关于type_C接口
- 【Error】解决ubuntu 18.04 dns故障
- 硬盘Master和Slave是什么意思?
- Win2003 Enterprise x64 Edition漏洞下载地址
- python 绘制科赫雪花
- 中国IT缘何落后于印度
- 阿里P8架构师谈:消息中间件介绍、典型使用场景、以及使用原则
- [原创]夺棋赛HackTheBox OpenSource攻略
- 智慧城市无线充电故障和fitbits总体规划8月以来的热门新闻