与线性表相似,串也有两种基本存储结构,顺序存储和链式存储。但考虑到存储效率和算法的方便性,串多采用顺序存储结构。

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算法相关推荐

  1. 4.3串的模式匹配算法(BF算法)

    4.3.1 求子串位置的定位函数Index(S,T,pos) 子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法. 算法4.5: 下面是 ...

  2. 字符串匹配算法(BF算法KMP算法)

    字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...

  3. 《数据结构》—— 串的模式匹配算法

    串的模式匹配 一.简单的模式匹配算法(BF算法) 二.KMP算法 一.简单的模式匹配算法(BF算法) 在实际应用中我们常常能用到类似串的模式匹配,也称子串的定位操作.例如单词查找,百度搜索都是串的模式 ...

  4. 第四章:2.串 -- 串的模式匹配算法(KMP)

    前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...

  5. 数据结构笔记(十四)-- 串的模式匹配算法

    串的模式匹配算法 一.普通模式匹配算法 1.算法解析 普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果. 例如,使用普通模式匹配算法判断串 T( ...

  6. 串的模式匹配算法(超详细)

    串的模式匹配 1 简单的模式匹配算法 2 KMP算法 3 KMP算法改进 4 时间复杂度比较 1 简单的模式匹配算法 思想: 将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串或所 ...

  7. 数据结构:KMP算法 串的模式匹配算法(全网最详细)

    目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理         接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...

  8. 串的模式匹配算法1-BF算法

    目录 1.BF算法 1.1匹配过程: 1.2直接使用string方法编写BF算法: 1.3编写SString来编写BF算法 子串的定位运算通常称为串的模式匹配或是串匹配.著名的算法有BF算法和KMP算 ...

  9. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

  10. 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)

    [算法流程] 朴素的字符串匹配算法即暴力匹配算法(BF,Brute Force),其本质是暴力枚举,主要特点有: 没有预处理阶段: 滑动窗口总是后移 1 位: 对模式中的字符的比较顺序不限定,可以从前 ...

最新文章

  1. 基于Web Services建立Asp与Asp.Net之间Session数据桥的应用研究
  2. one order callback frequency
  3. 爬虫遇到路径转换的解决方案
  4. linux文件夹权限_五分钟搞定 Linux 文档全部知识,就看这篇文章
  5. 哨兵1号(sentinel 1)数据各参数介绍
  6. java 万年历_java实现万年历
  7. iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?
  8. AI自动剪辑生成视频探索实践
  9. 【appium】appium自动化入门之基本参数完整版(67个appium基本参数和关键字)
  10. Windows10无法完成更新 正在撤销更改怎么解决转载
  11. LCA 天天爱跑步
  12. 关于type_C接口
  13. 【Error】解决ubuntu 18.04 dns故障
  14. 硬盘Master和Slave是什么意思?
  15. Win2003 Enterprise x64 Edition漏洞下载地址
  16. python 绘制科赫雪花
  17. 中国IT缘何落后于印度
  18. 阿里P8架构师谈:消息中间件介绍、典型使用场景、以及使用原则
  19. [原创]夺棋赛HackTheBox OpenSource攻略
  20. 智慧城市无线充电故障和fitbits总体规划8月以来的热门新闻

热门文章

  1. 简述多媒体计算机的特点,多媒体课件的特点和作用
  2. 捷径越来越少,快钱越来越难,为什么人生的路越来越窄?
  3. python循环次数教程_Python基础教程-循环
  4. 为什么逍遥子说,双11已成全球的社会大协同?
  5. 业余选手击打高远球的三个错误
  6. 1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B说我也知道了,请你猜猜这两个数的和是多少
  7. 随手写的绿色征途手游的脚本辅助代码
  8. php 支持zip解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
  9. 网络术语大扫盲2007版
  10. IOI2008 island