字符串匹配算法(代码片段)

chentianwei chentianwei     2023-05-07     550

关键词:

字符串匹配算法

 

原文摘录:https://www.cnblogs.com/gaochundong/p/string_matching.html

首先是一系列概念定义:

  • 文本Text: 是一个长度为n的数组T[1..n]  (??这里第一位置索引是数字1)
  • 模式Pattern: 是一个长度为m的数组P[1..m],  并且m<=n.
  • T和P的元素都属于有限的字母表Σ 表
  • 概念:有效位移Valid Shift(用字母s代表)。即P在T中出现,并且位置移动s次。如果0<=  s <= n-m ,并且T[s+1..s+m] = P[1..m],则s是有效位移。

技术图片

 

 上图的有效位移是3。

 

解决字符串的算法非常多:

朴素算法(Naive Algorithm)、Rabin-Karp 算法、有限自动机算法(Finite Automation)、 Knuth-Morris-Pratt 算法(即 KMP Algorithm)、Boyer-Moore 算法、Simon 算法、Colussi 算法、Galil-Giancarlo 算法、Apostolico-Crochemore 算法、Horspool 算法和 Sunday 算法等。

 

字符串匹配算法通常分为2个步骤:预处理和匹配。算法的总运行时间是两者之和。

技术图片

下文举例:

朴素的字符串匹配算法(Naive String Matching Algorithm)

就是穷举法,枚举法,也叫暴力匹配。是最低效最原始的算法。特点:

  1. 无预处理阶段。(因为是暴力匹配)
  2. 对Pattern,可以从T的首或尾开始逐个匹配字母,比较顺序没有限制。
  3. 最坏时间复杂度O((n-m+1)*m).

方法是使用循环来检查是否在范围n-m+1中存在满足条件P[1..m] = T[s+1..s+m]的有效位移s。

伪代码:

Native_string_matcher(T, P)
  n <- length[T]
  m <- length[P]
  for s <- 0 to n - m
    do if P[1..m] = T[s+1..s+m]
       then print "Pattern occurs with shift"

 

技术图片

 

Knuth-Morris-Pratt 字符串匹配算法(即 KMP 算法)

这是对Pattern进行预处理的算法。

我的理解是:

P中是否有重复的字符串。对自身匹配,逐个位移,并记录位移后,能够匹配(重复)几个字符。然后在实际和其他文本进行匹配时,就可以利用已知的信息,减少重复比较。

 

漫画:如何优化“字符串匹配算法”?(代码片段)

漫画:如何优化“字符串匹配算法”?说起“字符串匹配”,恐怕算得上是计算机领域应用最多的功能之一,为了满足这一需求,聪明的计算机科学家们发明了许多巧妙的算法。在上一篇漫画中,我们介绍了BF算法和RK算法,没... 查看详情

算法kmp字符串匹配算法(代码片段)

【原理】(1)next数组原理 (2)特殊情况的处理(巧妙增设哨兵)(3)递推法构造next[]表  【实现代码】#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmaxn=100;chart[maxn];//textcharp[ 查看详情

字符串匹配算法(bf算法&&kmp算法)(代码片段)

字符串匹配算法暴力匹配(BF)算法KMP算法next数组求next数组的练习next数组的优化(nextval数组)练习暴力匹配(BF)算法BF算法,即暴力(BruteForce)算法,是普通的模式匹配算法,BF算法的思想就是... 查看详情

模式匹配算法(代码片段)

...通过将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一... 查看详情

字符串暴力匹配算法详解(代码片段)

字符串暴力匹配算法详解说明字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对从长字符串的第一个字符开始,判断是否和子字... 查看详情

kmp算法(代码片段)

基本介绍KMP算法是一种用于字符串匹配的算法,网上关于kmp的介绍很多,也十分复杂,(其实我也没怎么搞懂)。首先我们还是考虑朴素的匹配,暴力枚举匹配起点,遇到不匹配的点,就直接退出,进行下一个起始点开始的一轮... 查看详情

字符串匹配算法知多少?(代码片段)

...法:BM算法坏字符好后缀规则代码实现KMP算法一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢?想到是很正常的,谁让它那么优秀呢。BF算法不要被事物的表面现象所迷惑,这个算... 查看详情

kmp算法(字符串的匹配)(代码片段)

视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n)。 设主串为ptr="ababaaababaa";,要比较的子串为a=“aab”; KMP算法用到了next... 查看详情

bf算法(蛮力匹配算法)(代码片段)

...字符和S的开始位置对比,直到S中每一个字符和M中的连续字符串相等,否则不匹配。C#代码-->privatestaticintIndex(stringm,intpos,strings)intm_len=m.Length;ints_len=s.Length;inti=pos-1;int 查看详情

kmp算法详解及其java实现(代码片段)

KMP算法,又称作“看猫片”算法(误),是一种改进的字符串模式匹配算法,可以在O(n+m)的时间复杂度以内完成字符串的匹配操作,其核心思想在于:当一趟匹配过程中出现字符不匹配时,不需要回溯主串的指针,而是利用已经... 查看详情

kmp算法(代码片段)

KMP算法写OJ时做到字符串匹配问题,用暴力算法结果超出时间限制了,其实早就知道这种问题可以用kmp算法解决,但是我一直懒得学,于是借助这个OJ来记录一下学习kmp算法的一些个人理解文章目录KMP算法字符串匹... 查看详情

kmp算法(代码片段)

KMP算法写OJ时做到字符串匹配问题,用暴力算法结果超出时间限制了,其实早就知道这种问题可以用kmp算法解决,但是我一直懒得学,于是借助这个OJ来记录一下学习kmp算法的一些个人理解文章目录KMP算法字符串匹... 查看详情

字符串模式匹配中的bf算法与kmp算法(代码片段)

博客园的编辑器太难用了。。。。。。。。。。。BF算法即暴力算法,很简单,随便举个栗子:#include<iostream>#include<cstring>usingnamespacestd;//S[]:要匹配的链//T[]:模式串intBFsearch(intstart,charS[],charT[])intslen=strlen(S);inttlen=strlen(T 查看详情

kmp算法(字符串匹配)(代码片段)

字符串匹配是常见的算法题,就有一个字符串判断里面是否包含另一个字符串。举例来说,有一个字符串"AAAAAABC"(主串),我想知道,里面是否包含另一个字符串"AAAB"(模式串)?... 查看详情

kmp算法(字符串匹配)(代码片段)

字符串匹配是常见的算法题,就有一个字符串判断里面是否包含另一个字符串。举例来说,有一个字符串"AAAAAABC"(主串),我想知道,里面是否包含另一个字符串"AAAB"(模式串)?... 查看详情

字符串匹配算法实现(代码片段)

KMP算法1voidNext(char*src,intn,int*next)23intj,k;4j=0;5k=-1;6next[0]=-1;7while(j<n-1)89if(k==-1||src[j]==src[k])1011++k;++j;12next[j]=k;1314else15k=next[k];16171819intKMP(char*des,intn,char*src 查看详情

python怎么实现模式匹配?(代码片段)

python通过BF算法实现关键词匹配,BF算法,即暴风(BruteForce)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相... 查看详情

数据结构串---bf算法(朴素模式匹配)(代码片段)

...BF算法了解BF算法,即暴风(BruteForce)算法,是普通的模式匹配算法。BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则比较S的第二个字... 查看详情