T称为目标串(Target)或主串 ,P称为模式串(Pattren) 或子串

1、 简单字符串模式匹配算法

原理:用字符串P的字符依次与字符串T中的字符进行比较,首先将字符串P从第0个位置起与主串T的第pos个字符起依次进行比较对应字符,

如果全部对应相等,则表明已找到匹配,成功终止;否则将字符串P从第0个位置起与主串T的第pos+1个字符起依次进行比较对应字符,

过程类似。   如果直到匹配完主串T的所有字母 都没有找到,则匹配失败

2、首尾字符串模式匹配算法

原理:与简单字符串的基本原理相同,不同点是在 判断字符串是否相同的过程中,

简单字符串模式匹配算法 是按 第一个字符,第二个字符。。。。第n个字符的顺序进行对应匹配

首尾字符串模式匹配算法 是按 第一个字符,第n个字符,第二个字符,第n-1个字符的顺序进行匹配

造成前两个算法效率低的主要原因是在算法的执行过程中有回溯,而这些回溯都可以避免。比如:

T:abaabab

P:abab

假设pos=0 ,第一趟匹配的时候,t0=p0,t1=p1,t2=p2,t3!=p3,然而在模式串中p0!=p1,所以可以推知t1=p1!=p0,所以在第二趟的匹配中,将P右移一位,用t1与p0

比较一定不等,所以右移一位是无效位移。又因为p0=p2,所以t2=p2=p0,因此若直接将P右移两位,t2与p0的比较肯定是相等的,所以右移两位是有效位移。所以,KMP算法

在于寻找有效位移,跳过无效的比较,消除回溯。

3、KMP字符串模式匹配算法

假设第i+1趟的时候有 ti t(i+1).....t(i+j-1) = p0 p1 ...p(j-1) 且 p0 p1 ...p(j-2) != p1 p2 ...p(j-1)

可推知  t(i+1) t(i+2) ..t(i+j-1) = p1 p 2 ...p(j-1) != p0 p1 ...p(j-2)

所以第i+2趟 一定不匹配

以此类推

判断第i+3趟时,如果模式串P中 有  p0 p1 ...p(j-3)!= p2 p3 ...p(j-1)  则可推知 第i+3趟一定不匹配

重点:  直到对某值k,使得p0 p1.....p(k-1) =  p(j-k) p(j-k+1)....p(j-1)

KMP算法的关键就在于匹配失败后,确定k的值,对不同的j有不同的k值,k值依赖于模式串P的前 j 个字符的构成,next[j]=k.

计算 next[j],就是要在串p0 p1...p(j-1) 中找出最长的相等的两个子串"p0 p1.....p(k-1)" 和 “p(j-k) p(j-k+1)....p(j-1) ”

next[j+1] = {next(m)[j] +1,0} 选择前者:能找到最小的正整数m,使得p(下标:next(m)[j]) = p(下标:j)

选择后者: 找不到m或j=0

字符串匹配算法(在字符串T中查找是否有与字符串P相同的子串)的更多相关文章

  1. linux strings-在对象文件或二进制文件中查找可打印的字符串

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. str ...

  2. strings---对象文件或二进制文件中查找可打印的字符串

    strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. strings命令对识别随机对象文件很有用. 语法 strings [ - ...

  3. word search(二维数组中查找单词(匹配字符串))

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  4. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  5. 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解

    一.前言   在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...

  6. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  7. 字符串匹配算法系列一:KMP算法原理

    本文主要参考了https://mp.weixin.qq.com/s/rbaPmBejID8-rYui35Snrg的表述,加上部分自己的理解 学习任何算法都要了解该算法解决什么问题?我们看看KMP算法主 ...

  8. [转]grep 在文本中查找内容

    转自: http://www.lampweb.org/linux/3/27.html 功能:grep系列是Linux中使用频率最高的文本查找命令.主要功能在一个或者多个文件中查找特定模式的字符串.如果 ...

  9. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

随机推荐

  1. 如何查看CRM WebUI,C4C和Hybris里的页面技术信息

    CRM 在WebClient UI页面上按F2,就能看到页面的技术信息, 可以找到当前页面是哪一个BSP component实现的: C4C 在浏览器url里添加debugMode=true,然后按住 ...

  2. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  3. linux用命令行运行matlab的.mat文件

    入m文件所在目录后,运行 $ matlab -nodesktop -nosplash -r matlabfile 只用文件名matlabfile,不能添加.m

  4. python_19_编码解码

    msg="我爱北京天安门" #字符串转成Byte类型 print(msg.encode())#encode 编码 print(msg.encode(encoding="u ...

  5. pycharm 安装插件 支持markdown

    github项目中的README文件通常是md格式的,但是pycharm默认是不支持的,需要安装插件 进入settings中搜索plugins,然后在plugins中搜索markdown suppor ...

  6. HttpServletRequest HttpServletResponse ServletException 重新打开后报红解决方法

    tomcat安装路径下\lib\servlet-api.jar 复制到Dynamic Web Project 的 WEB-INF/lib下,刷新

  7. 去除select下拉框默认样式

    去除select下拉框默认样式 select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #; /*很关键:将默认的select选 ...

  8. 抽象类&接口区别

    抽象类:1.可以有构造方法.   2.可以有抽象方法也可以有具体方法. 3.权限修饰符可以是private.默认.protected.public. 4.可以定义成员变量.   5.interface ...

  9. Mysql--子查询、分页查询、联合查询

    一. 子查询的定义 出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询,子查询可以包含普通select可以包含的任何语句. 外部查询:select.inser ...

  10. ZendFramework-2.4 源代码 - 关于MVC - Model层

    所谓的谓词Predicate // ------ 所谓的谓词 ------ // 条件 case.3 $where = new \Zend\Db\Sql\Where(); $expression = ...