字符串匹配算法(在字符串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 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
随机推荐
- UVA Live Archive 4015 Cave (树形dp,分组背包)
和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...
- Aizu 2300 Calender Colors(暴力)
状压以后,直接暴力枚举,2^20约等于1e6,而且满足bitcount = m的状态很少. #include<bits/stdc++.h> using namespace std; +; ...
- python基础一 day16 内置函数
# 数据类型 :int bool ...# 数据结构 : dict list tuple set str reversed()l = [1,2,3,4,5]l.reverse()print(l)l = ...
- Java 发送 Http请求工具类
HttpClient.java package util; import java.io.BufferedReader; import java.io.IOException; import java ...
- 题解 CF734A 【Anton and Danik】
本蒟蒻闲来无事刷刷水题 话说这道题,看楼下的大佬们基本都是用字符 ( char ) 来做的,那么我来介绍一下C++的优势: string ! string,也就是类型串,是C语言没有的,使用十分方便 ...
- 分词,复旦nlp,NLPIR汉语分词系统
http://www.nlpir.org/ http://blog.csdn.net/zhyh1986/article/details/9167593
- C# checked运算符
一.C# checked运算符 checked运算符用于对整型算术运算和显式转换启用溢出检查. 默认情况下,表达式产生的值如果超出了目标类型的范围,将会产生两种情况: ?常数表达式将导致编译时错误. ...
- 短短几行css代码实现滚动条效果
如何实现使用css实现滚动条效果 实现效果,运用线性渐变来实现功能 假设我们的页面被包裹在 <body> 中,可以滚动的是整个 body,给它添加这样一个从左下到到右上角的线性渐变: bo ...
- JQuery模拟点击页面上的所有a标签,触发onclick事件
注意: 这种方法需要给所有的a标签加上id属性 页面加载完成模拟点击所有的a标签: <script> $(function () { // 模拟点击页面上的所有a标签,触发onclick事 ...
- MySQL-Xtrabackup备份还原
前言 通常我们都是使用xtrabackup工具来备份数据库,它是一个专业的备份工具,先来简单介绍下它. Xtrabackup percona提供的mysql数据库备份工具,惟一开源的能够对innodb ...