一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找失败.两种主要的模式匹配算法是Brute Force算法和KMP算法. 二.Brute Force算法 1.Brute Force算法也被称为朴素的模式匹配算法,是一种简单.直观的模式匹配算法.简单来说,就是对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配.对主串做大循环,每个字符开头做次数…
一.KMP算法介绍 KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯.回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj位置对齐.从左向右逐个进行比较,发现 pi 处的字符a 与 tj+1 处字符b发生失配.同时也表明 P(p0,p1,...,pi-1) 与 T'(tj,tj+1,...,tj+i-1) 是完全匹配的,这一部分子串在图中用字母u标示出.由于发生失配,随即移动模式字符串并进行下一轮的比较.此时,很自然地…
  数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute…
假设主串:a b a b c a b c a c b a b      子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c b a b a b c 第二趟 a b a b c a b c a c b a b    a 第三趟 a b a b c a b c a c b a b     a b c a c 第四趟 a b a b c a b c a c b a b       a 第五趟 a b a b c a b c a…
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发现了该算法效率并不高.当失配位置之前已经有若干字符匹配时,暴力法很多步骤是多余的.举个KMP算法的例子,看图1 可以看到子串p和主串t在红框处失配了,失配之前的字符串ABC已经匹配.ABA第一个字符A和后面的字符都不同,所以可以放心地直接将子串p的p[0]对齐失配处i,让p[0]和t[i]接着比较.…
KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的最后也讨论这个算法的局限性. 一般的匹配算法: KMP基本概念引入: 但是,其实我们会发现,上面的中间两个匹配步骤是没有必要的,因为他们的第一个匹配字母就不相同,完全没有可比性,而当我们在第四次匹配的时候,其实我们从模式串中就可得知,只有当模式串滑到这个地方的时候,它的匹配才是最有价值的,因为从模式…
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法,即下标从0开始. BF算法 BF(Brute Force)算法也就是传说中的“笨办法”,是一个暴力/蛮力算法.设串S和P的长度分别为m,n,则它在最坏情况下的时间复杂度是O(m*n).BF算法的最坏时间复杂度虽然不好,但它易于理解和编程,在实际应用中,一般还能达到近似于O(m+n)的时间度(最坏情…
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右移动,而字符的比较时由右向左进行.当文本字符与模式不匹配时,则根据预先定义好的"坏字符串偏移函数"和"好后缀偏移函数"计算出偏移量.它的简化版本BMH或整个算法通常在文本编辑器中用于"搜索"和"替代"命令.该算法从最右边的字符开始…
一.BMH算法介绍 在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用.在实际匹配过程,只是用坏字符偏移函数也非常有效.1980年,奈杰尔·豪斯普(Nigel Horspool)提出了改进的BM算法,也就是BMH算法.简化了BM算法,执行非常方便,效率也很可观.Boyer-Moore算法使用两种策略来确定不匹配模式的位移:坏字符策略和高端策略. 来自Horspool的想法是仅使用坏字符策略,而不使用导致不匹配的字符…
准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结构是一组地址连续的存储单元来存储字符串中的字符序列:按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义.——空间分配不灵活,但是字符串一般都是连在一起表述的,”断章取义“的情况并不多,所以习惯上我们还是会直接定义一个足够长度的存储区来存储. 链式存储结构 BF算法…