2.4、字符串模式匹配

资讯网址:www.qghkt.com

腾讯课堂:https://qghkt.ke.qq.com/20个常用算法

模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一。

2.4.1、布鲁特-福斯算法

【基本思想】

从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功;如果在主串中不存在与模式串相同的子串,则匹配失败。

【图解过程】

给定主串“ABCDABCDABBABCDABCDABDD”,子串“ABCDABD”。

1)第一趟比较,先比较A,然后是BCDAB。

A

B

C

D

A

B

C

D

A

B

B

A

B

C

D

A

B

C

D

A

B

D

D

A

B

C

D

A

B

在比较最后一个字符D时,不匹配。

A

B

C

D

A

B

C

D

A

B

B

A

B

C

D

A

B

C

D

A

B

D

D

A

B

C

D

A

B

D

2)第二趟比较,主串回退到比前一趟加1的位置。子串从0开始。第一个就不匹配。结束本趟。

A

B

C

D

A

B

C

D

A

B

B

A

B

C

D

A

B

C

D

A

B

D

D

A

3)第三趟比较,主串前移一个位置,子串从0开始。第一个还是不匹配。同样结束本趟。

A

B

C

D

A

B

C

D

A

B

B

A

B

C

D

A

B

C

D

A

B

D

D

A

……

i)第i趟比较,找到可以匹配的子串

A

B

C

D

A

B

C

D

A

B

B

A

B

C

D

A

B

C

D

A

B

D

D

A

B

C

D

A

B

D

【查找长度】

假设主串的长度为n,模式串的长度为m,位置序号从1开始。设从主串的第i个字符位置开始与模式串匹配成功,而在前i-1趟匹配中,每趟不成功的匹配都是模式串的第一个字符与主串中相应的字符不相同,则在前i-1趟匹配中,字符间的比较共进行了i-1次,因第i趟成功匹配的字符比较次数为m,所以总的字符比较次数为i-1+m且1≤i≤n-m+1。若在这n-m+1个起始位置上匹配成功的概率相同,则在最好的情况下,匹配成功时字符间的平均比较次数为。最好的情况下为O(n+m)。最坏的情况下,每一趟不成功的匹配都是模式串的最后一个字符与主串中相应的字符不相等。若设第i趟匹配时成功,则前i-1趟不成功的匹配中,每趟都比较了m次,总共比较了(i-1)*m+m,平均比较次数为。由于,所以该算法在最坏情况下的时间复杂度为O(n*m)。

【算法代码】

/****************************************************************

* 函数名称:searchFS

* 功能描述:布鲁特-福斯模式匹配

* 参数说明:src, 主串

*                 sub, 模式串

* 返 回 值:-1,表示不成功,非0的值表示模式串sub在主串src的位置

* 作    者:www.qghkt.com

* 创建时间:

*****************************************************************

* Copyright @ 清哥好课堂  Allrights reserved

*****************************************************************/

int searchFS(const char *src, const char*sub)

{

int i, j;

i = 0;

j = 0;

int strLen= strlen1(src);

int tLen =strlen1(sub);

while(i<strLen && j<tLen)

{

if(src[i] == sub[j])

{

++i;

++j;

}

else

{

//主串回退

i= i - j + 1;

//子串

j= 0;

}

}

if (j>= tLen)

{

return(i - tLen);

}

return -1;

}

int searchFS(const char *src, const char*sub, int pos)

{

int i, j;

i = pos;

j = 0;

int strLen= strlen1(src);

int tLen =strlen1(sub);

while(i<strLen && j<tLen)

{

if (src[i]== sub[j])

{

++i;

++j;

}

else

{

//主串回退

i= i - j + 1;

//子串

j= 0;

}

}

if (j>= tLen)

{

return(i - tLen);

}

return -1;

}

/****************************************************************

* 函数名称:searchFSAll

* 功能描述:查找模式串在主串中所有的出现的位置

* 参数说明:locArr, 位置的数组

*                 src, 主串

*                 sub, 模式串

* 返 回 值:0,表示没有匹配的,非值,表示有匹配的个数

* 作    者:www.qghkt.com

* 创建时间:

*****************************************************************

* Copyright @ 清哥好课堂  Allrights reserved

*****************************************************************/

转载于:https://www.cnblogs.com/lifecode/p/9314264.html

【算法视频】字符串模式匹配--布鲁特.福斯算法相关推荐

  1. 【数据结构与算法基础】模式匹配问题与KMP算法

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  2. 字符串处理:布鲁特--福斯算法

    基本思想: 其基本思想是从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符的后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中的每个字符依次和主串中的一 ...

  3. 字符串的模式匹配(KMP)算法

    一.背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  4. 字符串模式匹配——最长公共子序列与子串 KMP 算法

    最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, ...

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

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

  6. KMP算法字符串模式匹配

    KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算 ...

  7. 北京大学数据结构与算法视频下载

    数据结构与算法视频下载 北京大学张铭老师 视频下载 [转载] 第一讲 第1章 概论--1(概念.逻辑结构.存储) http://db.pku.edu.cn/mzhang/ds/media/1_intr ...

  8. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  9. 非常棒的数据结构与算法视频

    第一讲 第1章 概论--1(概念.逻辑结构.存储) 下载rm pdf 第二讲 第1章 概论--2(存储结构,ADT,算法特征,算法量度) 下载rm     第三讲 第2章 线性表.栈和队列--1(线性 ...

最新文章

  1. R聚类(整群)抽样(Cluster Sampling)
  2. [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin
  3. setsockopt
  4. 第十一届山东省大学生程序设计竞赛(热身赛)Mika with Cherry Cake
  5. [LeetCode]k个一组翻转链表(Reverse Nodes in k-Group)
  6. 人工智能AI实战100讲(二)-自动驾驶传感器之激光雷达(一)激光雷达为何必不可少?
  7. java layoutmanager_Java Swing 探索(一)LayoutManager
  8. 对于有志于成为架构师的开发者,支付宝架构团队有何建议?
  9. python单词的含义-python实现单词本功能
  10. 如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
  11. 2021FME博客大赛 —— FME在无名河流水系实体化中的应用实践
  12. 王小川告别搜狗那一天
  13. Android Retrofit Put请求
  14. 视频教程-AI 教程illustrator从入门到精通-Illustrator
  15. [篇二章七]_安装卸载 VMware Tools
  16. 通达信 c java,通达信的c
  17. Leetcode_96_Unique Binary Search Trees
  18. Qt音视频开发7-ffmpeg音频播放
  19. 什么是常识?一个人独立生活所具备的能力
  20. xp无法访问win7计算机提示无权限,ghost xp访问win7共享无权限怎么解决

热门文章

  1. 函数名的使用、闭包、生成器
  2. LeeCode-------Letter Combinations of a Phone Number 解法
  3. iframe高度自适应的6个方法
  4. caffe MNIST官方文档中文版
  5. GCD之线程挂起与恢复
  6. 使用RMAN传输表空间复制数据
  7. 基于KNN实现图像分类——理解图像分类
  8. 如何在Linux上部署Jenkins
  9. (17)Vivado IP综合选项Global和Out-Of-Context区别(FPGA不积跬步101)
  10. (125)FPGA面试题-熟悉AXI总线吗,介绍AXI