kmp模式串匹配
大二的时候百度看不懂,现在大三下学期了百度也看不懂。(实在是不能理解这个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模式串匹配的更多相关文章
- KMP 模式串匹配 失去匹配的瞬间你还有什么
KMP: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP算法的关键 ...
- 模式串匹配KMP详解
关于KMP模式串匹配网上蛮多的. 对于KMP有自己理解所以写下来希望能够对你们的学习有帮助. 之前暑假的时候学过,然后好长时间没用发现又忘了,现在再看看发现有了新的理解. ============== ...
- 模式串匹配之KMP算法
模式串匹配之KMP算法 KMP算法 模式值计算(next[j]) (1) next[0]=-1, 第一个字符模式值为-1 (2) next[j]=-1, T中下标为j的字符与首字符相同,且j前面的1 ...
- 单模式串匹配----浅谈kmp算法
模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s. 模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...
- hdu 1686 Oulipo 【KMP】(计算模式串匹配的次数——与已匹配的字串可以有交集)
题目链接:https://vjudge.net/contest/220679#problem/B 题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于100 ...
- C++编程练习(7)----“KMP模式匹配算法“字符串匹配
子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...
- AC自动机——多模式串匹配的算法思想
标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算 ...
- 【数据结构】 字符串&KMP子串匹配算法
字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...
- 【转载】多模式串匹配之AC自动机
原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...
随机推荐
- C#-VS支持的语言
其中C语言选C++
- C#-VS程序集
程序集即代码组,可以是单个文件或多个文件,按一个整体部署,但可指定自身调用其他程序集的版本. 推出原因 为解决dll地狱而推出,也可解决其他问题.dll地狱,a应用使用dll版本1,b应用使用dll版 ...
- day24(JAVAWEB上传与下载)
javaWeb上传与下载 上传: 上传方式: jspSmartUpload :应用在jsp上的文件上传与下载组件. FileUpload :用用在jaava环境上的上传的功能 ...
- poj 2488 A Knight's Journey
题目 题意:给出一个国际棋盘的大小 p*q,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 因为要求字典序输出最小,所以按下图是搜索的次序搜素出来的就是最小的. 初始方向数组:i ...
- Huffman 编码压缩算法
前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...
- pm2
使用PM2将Node.js的集群变得更加容易(http://www.cnblogs.com/jaxu/p/5193643.html) nodejs pm2配置使用教程(http://blog.csdn ...
- hdu 3910 Liang Guo Sha
题目链接:hdu 3910 Liang Guo Sha 题目大意:Alice和Bob这两个小伙伴又发明了一种新游戏, 叫两国杀, 每个人手上有两张牌,“杀” 和“闪”, 然后有三个数值A,B和C, 当 ...
- 那些好用的阅读软件(Windows & Android)
此文章已添加预览与更新,请您移步到我的新博客 http://t.cn/EXCiCTE 整个2018年就没写过几篇博文,所以写一篇文章算过年啦-哈哈-有部分软件因为年代原因,官网已经消失.或者网络上的资 ...
- NPOI 操作笔记
public static class ExcelUtil { // Methods public static DataTable GetDataTable(Stream stream) { HSS ...
- Lerning Entity Framework 6 ------ Introduction to TPH
Sometimes, you have created two models. They have the same parent class like this: public class Pers ...