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

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

时间: 2024-10-12 21:15:32

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

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

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

字符串模式匹配的几种算法

1.KMP算法 KMP算法程序看起来比较简单,但是求next数组的过程还是比较难理解,next数组实质就是求最大的前后缀,该算法的复杂度是O(m+n),算法流程如下: 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置 如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符: 如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j].此举意味着失配时,模式串P相对于文本串S向右移动了

【视频】20个常用算法视频讲解

20个常用算法 视频网址: http://www.qghkt.com/ 20个常用算法视频地址: https://ke.qq.com/course/309464?tuin=a508ea62 目  录一.查找算法... 21.1.顺序查找... 21.2.折半查找... 41.3.哈希查找... 7二.字符串算法... 132.1.求字符串长度... 132.2.字符串拷贝... 152.3.字符串比较... 152.4.字符串模式匹配... 162.4.1.布鲁特-福斯算法... 162.4.2

字符串模式匹配sunday算法

文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: https://oj.leetcode.com/problems/implement-strstr/ 我一看就懵了,字符串模式匹配我记得当时在上数据结构的时候,书上只写了BF和KMP算法,老师说考试“只可能会考BF”,KMP不要求掌握. 然后出于一颗探求的心,我还是看了一下KMP,这算法好难理解,于是就没

KMP算法 (字符串的匹配)

视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n). 设主串为ptr="ababaaababaa";,要比较的子串为a="aab": KMP算法用到了next数组,然后利用next数组的值来提高匹配速度,我首先讲一下next数组怎么求,之后再讲匹配方式. next数组详解 首先是理解KMP算法的第一个难关是next数组每个值的确定,这个问题困恼我很长时间,尤其是对照着代码一

常用算法3 - 字符串查找/模式匹配算法(BF &amp; KMP算法)

相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟海的文本中正确匹配到我们所需要的字符串呢?这就牵扯到了模式匹配算法! 1. 模式匹配 什么是模式匹配呢? 模式匹配,即子串P(模式串)在主串T(目标串)中的定位运算,也称串匹配 假设我们有两个字符串:T(Target, 目标串)和P(Pattern, 模式串):在目标串T中查找模式串T的定位过程,称

[算法]将字符串中的*前置,非*字符相对位置不变

如ab**cd*e12变成 ****abcde12 char* foo(char* str, int length){ int i = length-1,j = length-1; while(i >= 0 && j >= 0){ while(i >= 0 && '*' != str[i]){ --i; } j = i - 1; while(j >= 0 && '*' == str[j]){ --j; } if(j >= 0){

算法之字符串专题

一.单串匹配问题 poj2406(求字符串的周期)利用next[ ]性质,ans=next[len]%(len-next[len])==0?next[len]/(len-next[len]):1; poj2752(求所有相同的前后缀)利用next[ ]性质,pos=next[pos](不断向前找) next[0]=-1: next[i]=max(相同前后缀) poj3461(kmp模板题) 二.多串匹配问题 poj3080.poj3450(求多串最长公共字串且字典序最小)二分,枚举首串(按字典序

zz 圣诞丨太阁所有的免费算法视频资料整理

首发于 太阁实验室 关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法类视频,均为免费观看,方便大家学习. 先放一个ACM大神讲解的算法题视频(国外传优酷真的是太不容易了……). ACM大神精讲北美最新面试题—在线播放—优酷网,视频高清在线观看http://v.youku.com/v_show/id_XMTg2ODk0MzIwMA==.html 其余视频: [公开课]ACM大神精