大二的时候百度看不懂,现在大三下学期了百度也看不懂。(实在是不能理解这个next数组究竟是怎么样工作的,为什么会得出那样的结果。)如果有好心人知道的话希望可以联系我告诉我(邮箱:4609019410@qq.com)

作用:字符串匹配

我们设匹配串为t,待匹配串为s,这个算法的功能就是在指定s中,从s的第i位字符开始搜索,判断在s中是否有t存在。

如果有则返回出现了t的首位字符位置(当然,这个数组是从0开始),如果没有则返回0。

通过next数组对匹配串t进行一个预处理,我们获得一个next数组。

下面的描述:string t:从0开始,next[]:从1开始

i=1;

这个next数组的意义是:对于我们要处理的字符串t里的第(i-1)字符对应的每一个next[i]元素

next[i]保存的是:从t[0]开始到t[i-1]的这一段字符串所有前缀与后缀的最大匹配长度。

next在kmp算法里发挥的作用:在每一次的匹配中,当碰上失配的情况(我们设初始态:t[0]与s[pos]开始比较,如果相等则两个指针同步增加变量。假设加到j时失配,即s[pos+j]!=t[j])

我们可以利用next数组存储的信息,让它加速前进(而不是像朴素的模式匹配算法那样一位一位地挪,又从t[0]开始与s[pos],提高匹配效率。)

几番周折还是弄不懂究竟是怎么运作的,所有只好先把实现的放上来,以后在琢磨是怎么回事了。以后弄明白了再回来说。。

#include<iostream>
#include<cstring>
using namespace std;
void get_next(string t,int *next)
{
int i=1,j=0;
next[1]=0;
while(i<t.length())
{
if(j==0||t[i]==t[j])
{
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int index_KMP(string s,string t,int pos)
{
int i=pos-1;
int j=0;
int next[255];
get_next(t,next);
//for(int i=1;i<=t.length();i++){
//cout<<next[i]<<" ";
//}
//cout<<endl;
while(i<s.length()&&j<t.length())
{
if(j==0||s[i]==t[j])
{i++;j++;}
else j=next[j];
}
if(j>=t.length())
return i-t.length();
else return 0;
}
int main()
{
string a,b;
cin>>a>>b;
int w;
cin>>w;
int ans=index_KMP(a,b,w);
cout<<ans<<endl;
return 0;
}

  

kmp模式串匹配的更多相关文章

  1. KMP 模式串匹配 失去匹配的瞬间你还有什么

    KMP: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键 ...

  2. 模式串匹配KMP详解

    关于KMP模式串匹配网上蛮多的. 对于KMP有自己理解所以写下来希望能够对你们的学习有帮助. 之前暑假的时候学过,然后好长时间没用发现又忘了,现在再看看发现有了新的理解. ============== ...

  3. 模式串匹配之KMP算法

    模式串匹配之KMP算法 KMP算法 模式值计算(next[j]) (1) next[0]=-1,  第一个字符模式值为-1 (2) next[j]=-1, T中下标为j的字符与首字符相同,且j前面的1 ...

  4. 单模式串匹配----浅谈kmp算法

    模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...

  5. hdu 1686 Oulipo 【KMP】(计算模式串匹配的次数——与已匹配的字串可以有交集)

    题目链接:https://vjudge.net/contest/220679#problem/B 题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于100 ...

  6. C++编程练习(7)----“KMP模式匹配算法“字符串匹配

    子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...

  7. AC自动机——多模式串匹配的算法思想

    标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算 ...

  8. 【数据结构】 字符串&KMP子串匹配算法

    字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...

  9. 【转载】多模式串匹配之AC自动机

    原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...

随机推荐

  1. python计算机硬件基础以及变量常量常量池,解释器编译器比较,python的两种运行方式

    1.什么是编程语言 语言是一个事物与另外一个事物沟通的介质 编程语言是程序员与计算机沟通的介质 2.什么是编程 编程就是程序按照某种编程语言的语法规范将自己想要让计算机做的事情表达出来 表达的结果就是 ...

  2. Ubuntu安装spyder并添加快捷方式

    Ubuntu安装spyder并添加快捷方式 之前通过 sudo apt install spyder sudo apt install spyder3 安装spyder,但是这样有个坏处,编译器只能用 ...

  3. HDOJ1024--Max Sum Plus Plus(动态规划)UnSolved

    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...

  4. STL容器-- forward_list 用法

    http://www.cplusplus.com/reference/forward_list/

  5. 佛祖保佑,永不死机 - /etc/motd文件配置

    /etc/motd (message of to day:每日信息) 一.执行命令: cat <<EOT >/etc/motd _oo0oo_ (| -_- |) \ = / ___ ...

  6. Java学习--数组的定义和使用

    1. 数组分配了空间,未赋值 public class ArrayDemo01{ public static void main(String args[]){ int score[] = null ...

  7. foreach控件的运用(非原创)http://blog.chinaunix.net/uid-26884465-id-3416869.html

    人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...

  8. Python 数据结构与算法—— 快排

    1. 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组.然后对这两个子数组再递归重复上述过程,直到两个子数组的所有 ...

  9. 工作随笔——pinpoint分布式性能监控工具(docker安装)

    在做性能压测的时候,你是不是有只能看到测试报告? 在做性能压测的时候,你是不是想知道每一个方法执行了多长时间? Pinpoint几乎可以帮助你查看你想看到的每一个细节. Pinpoint是什么? Pi ...

  10. Windows编译Opencv

    下载安装CMake 下载Opencv源码 打开CMake,设置源码路径和生成路径,点击Configure选择要生成的版本.(这里要多次Configure,直到所有红色消失!) 勾选BUILD_open ...