模式匹配的KMP 算法
常见的字符串匹配时,模式串长度为n,源串长度为m,则从头匹配,两个指针i指向源串,j指向模式串,如遇到不同则回溯使j=0,这样就要反复匹配会使效率变低。
因为在如今i之前 的模式串与匹配串的匹配是同样的,即回溯时,不用将模式串与源串进行匹配,而仅仅将模式串与自身匹配就可以得到其是否须要回溯以及回溯到何处。则我们能够在进行模式匹配之前,想对模式串进行自我匹配,来计算出对于i在模式串的任何位置匹配失败后回溯的位置。
而对于自身匹配的算法另一个优化的地方在于,模式串在b位置匹配到自身的a位置,然后推断一下这两个位置的字符是否同样,假设同样,则将a位置的回溯位置赋值给b,假设不同,则说明没有必要回溯到这个位置,由于回溯后不匹配,则直接将其置为0,表示从0開始又一次匹配、
失败函数的返回值为-1是用来设置其结构,使其可以在自我匹配时简单实现其功能,标识匹配失败又一次開始,但其在模式匹配中效果与0同样,都是i置为0,j++,然后继续匹配。
自我匹配放在一个失败函数中,对模式字符串进行操作,然后将结果放在一个数组中方便查询。
试着写出c++代码:
这里每次遍历时,是推断第i个字符串假设同样,那么第i加一个字符串不符就要返回的位置,每次都是对i+1进行操作,所以最后一次会对数组中下标为n的字符进行操作,会越界,则之前建fail数组时,要考虑一下。
void FailString(int f[],const char* str){
int length = strlen(str);
int i =0, k = -1;
f[0] = -1;
while( i < length){
if(k == -1 || str[i] == str[k]){
i++;k++;
if(str[i] == str[k])
f[i] = f[k];
else
f[i] = k;
}else
k = f[k];
}
}
bool compareString(const char* charA,const char* charB){
if( charA == 0 || charB == 0)
return false;
int Alen = strlen(charA);
int Blen = strlen(charB);
if( ! Alen || ! Blen )
return false;
if( Blen > Alen)return false;
int* fail = new int[ Blen+1 ];
FailString(fail,charB);
int i = 0 , j = 0;
while(i < Alen && j < Blen){
if( charA[i] != charB[j] ){
if(fail[i] == -1 )
j = 0;
else
j = fail[i];
}else
j ++;
i++;
}
delete[] fail;
fail =NULL ;
return j==Blen;
}
void main(){
char* s1 = "abcabcaabcabbac";
char* s2 = "abcabcabbac";
if(compareString(s1,s2))
cout<<"s1==s2"<<endl;
cin.get();
}
模式匹配的KMP 算法的更多相关文章
- 串的模式匹配和KMP算法
在对字符串的操作中,我们经常要用到子串的查找功能,我们称子串为模式串,模式串在主串中的查找过程我们成为模式匹配,KMP算法就是一个高效的模式匹配算法.KMP算法是蛮力算法的一种改进,下面我们先来介绍蛮 ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- 【模式匹配】KMP算法的来龙去脉
1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...
- 串的模式匹配,KMP算法
串的模式匹配 现考虑一个常用操作,在字符串s(我们称为主串)中的第pos开始处往后查找,看在主串s中有没有和子串p相匹配的的,如果有,则返回字串p第一次出现的位置. 暴力求解 int Index(ch ...
- 模式匹配的KMP算法详解
这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法.大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白. 注意到这 ...
- 字符串模式匹配之KMP算法的next数组详解与C++实现
相信来看next数组如何求解的童鞋已经对KMP算法是怎么回事有了一定的了解,这里就不再赘述,附上一个链接吧:https://www.cnblogs.com/c-cloud/p/3224788.html ...
- 模式匹配之Kmp算法
Kmp: 算法定义借鉴wikipedia: http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm#KMP_ ...
- 串的匹配:朴素匹配&KMP算法
引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式 ...
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
随机推荐
- HDU 1042.N!【高精度乘法】【8月24】
N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...
- [SCOI 2007] 排列
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1072 [算法] 状压DP [代码] #include<bits/stdc++. ...
- USACO 2.2 Preface Numbering
Preface Numbering A certain book's prefaces are numbered in upper case Roman numerals. Traditional R ...
- Node.js:连接 MySQL
ylbtech-Node.js:连接 MySQL 1.返回顶部 1. Node.js 连接 MySQL 本章节我们将为大家介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作. 如果你 ...
- BZOJ 3105 线性基 高斯消元
思路: 按照从大到小排个序 维护两个数组 一个是消元后的 另一个是 按照消元的位置排的 不断 维护从大到小 (呃具体见代码) //By SiriusRen #include <cstdio> ...
- Centos7 minimal 系列之NAT联网(一)
一.安装 参考:http://m.blog.csdn.net/qq_24879495/article/details/77838512 二.解决不能联网问题 打开网络共享中心,设置虚拟网卡 编辑虚拟机 ...
- CheckBox的Attributes
在看老同事写的代码的时候,发现了这样的一段代码:之前自己没有遇到过,记录下吧. 大致是这样的 foreach (GridViewRow grv in GridView1.Rows) { CheckBo ...
- Aspx小记
关闭按钮 protected void Close_Click(object sender, EventArgs e) { //Page.RegisterStartupScript("clo ...
- CodeIgniter 相关资源
CodeIgniter ci 如果需要扩展多个base Controller,譬如一个 core/MY_Controller表示基本Controller,一个 core/MY_AuthControl ...
- Mac 如何寻找Mac自带的IDLE
Mac 如何寻找Mac自带的IDLE 每次要打开IDLE时,需要如下动作:打开terminal --> 输入idle --> 回车,就自动打开IDLE了 图标如下: 选择在“Finder中 ...