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. mysqlimport命令

    mysqlimport的大多数选项直接对应LOAD DATA INFILE子句. 选项: -u,--user 指定连接用户名.   -p,--password[name] 指定连接用户的密码.   - ...

  2. Android(java)学习笔记92:Android线程形态之 AsyncTask (异步任务)

    1. AsyncTask和Handler的优缺点比较: 1)AsyncTask实现的原理和适用的优缺点        AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTa ...

  3. 在O(1)时间复杂度删除链表节点

    题目描述: 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 1->2->3-> ...

  4. ScriptMaker

    0x00 前言 pwn脚本千篇一律,之前也是保存了一份模板,每次都用它,但还是觉得每次都复制一次各种名字还是有的累,于是就写了一份脚本生成器 0x01 ScriptMaker #!/usr/bin/e ...

  5. Mysql之1451 - Cannot delete or update a parent row: a foreign key constraint fails...解决办法记录

    今天使用delete语句删除一张表中的一条信息时,提示了这么一个错误:1451 - Cannot delete or update a parent row: a foreign key constr ...

  6. 简单的Maven+SpringMVC

    一.SpringMVC非注解编程 1:修改pom.xml文件(相当于非Maven项目的导入jar包) <!-- https://mvnrepository.com/artifact/org.sp ...

  7. vue-cli的build的文件夹下没有dev-server.js文件,怎么配置mock数据

    因为最新版本的vue-cli已经放弃dev-server.js,只需在webpack.dev.conf.js配置就行 新版webpack.dev.conf.js配置如下: 在const portfin ...

  8. 【CodeBase】通过层级键在多维数组中获取目标值

    通过层级键在多维数组中获取目标值 /* *Author : @YunGaZeon *Date : 2017.08.09 *param data : Data Array *param keys : K ...

  9. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  10. Memory loss【记忆缺失】

    Memory Loss Losing your ability to think and remember is pretty scary. We know the risk of dementia ...