字符串匹配算法(在字符串T中查找是否有与字符串P相同的子串)
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相同的子串)的更多相关文章
- linux strings-在对象文件或二进制文件中查找可打印的字符串
推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. str ...
- strings---对象文件或二进制文件中查找可打印的字符串
strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. strings命令对识别随机对象文件很有用. 语法 strings [ - ...
- word search(二维数组中查找单词(匹配字符串))
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- 多模字符串匹配算法之AC自动机—原理与实现
简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...
- 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解
一.前言 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...
- Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...
- 字符串匹配算法系列一:KMP算法原理
本文主要参考了https://mp.weixin.qq.com/s/rbaPmBejID8-rYui35Snrg的表述,加上部分自己的理解 学习任何算法都要了解该算法解决什么问题?我们看看KMP算法主 ...
- [转]grep 在文本中查找内容
转自: http://www.lampweb.org/linux/3/27.html 功能:grep系列是Linux中使用频率最高的文本查找命令.主要功能在一个或者多个文件中查找特定模式的字符串.如果 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
随机推荐
- 工作流性能优化(敢问activiti有扩展性?)(2)
2015/4/17 粗略看了activiti的sql的,在ativity engine包里边: 没什么头绪,先用excel记录数据量少的时候本机的性能情况: 不打印hibernate的sql:一刷 ...
- POJ - 3111 K Best(二分)
包含一些ai和bi的集用S来表示,x = max(sigma(ai)/sigma(bi),i 属于S) ,k 表示S的大小,k= |S|. x和k之间具有单调性.k0 < k1 → x0 ≥ x ...
- NBU基本常用命令
Veritas常用命令: 1. 查看当有运行的任务 bpdbjobs –report | grep Active 2. 停止任务 bpdbjobs –cancel PID (包括主任务和子任务) 3. ...
- theano支持的数组、向量、矩阵表达式
1)theano主要支持符号矩阵表达式 (2)theano与numpy中都有broadcasting:numpy中是动态的,而theano需要在这之前就知道是哪维需要被广播.针对不同类型的数据给出如下 ...
- 操作系统(6)_虚拟存储管理_李善平ppt
image含各种段. 有些不需要的页可能永远不需要装入内存,可能只有百分之70-80是异常情况采用的,这种代码就可以放入硬盘. 抖动实际就是进程数太多导致内存不够用造成的. 页面换入换出在内存和磁盘之 ...
- Oracle 数字处理函数
数字处理函数 ① mod(number1,number2) 取余数的函数,比如mod(10,3) = 10/3 = 1. ② round(number,num_ditigs) .trunk(numbe ...
- 井字游戏 人机对战 java实现
package com.ecnu.Main; /** * 主函数触发游戏 */public class MainApplication { public static void main(String ...
- C++ ADL
即在一个名称作为调用运算符的左操作数时,并且这个名字是一个无限定名称时,在无限定查找到的名字集合中额外增加的一个规则使集合范围扩大(从而可以定位到其他一些限定名称),通常是用来保证定义在不同命名空间的 ...
- 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树
好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...
- .NET中变量生存期
Web窗体后台 cs 文件中,创建类作用域的变量,在关闭页面的时候并不会消失,当 IIS 站点被关闭的时候,才会调用这个变量的析构函数 但是好像也不肯定在关闭站点才会析构,应该是外层对象析构的时候才会 ...