看了两个晚上的KMP,加上基本的“暴力匹配”

今晚看懂next[j]递归求解时,突然觉得算法真的好美妙,虽然觉悟的晚但晚胜过没有是吧!

我的博客都是应试性的学习笔记,不具备指导性,还是大神们写的好,例如July和matrix67的博客(今天还知道了matrix67的传奇)

[置顶] 从头到尾彻底理解KMP(2014年8月22日版)

[置顶]         从头到尾彻底理解KMP(2014年8月22日版)

实习辞职了,可以全心全意看书找工作了,自由真是好!!为了我们俩以后在一起!!

什么时候努力都不晚,尽管我的路走的有些曲折,这鸡汤给自己灌得好哇!

今天菜鸟是为了明天的自己不菜鸟,扯多了……

KMP面对的问题:长串(文本串)是S串,短串(模式串)是P串,判断P串是否是S的一个子串,如果是找到P在S中的起始位置

S串 索引i

P串 索引j

KMP的思想:(假设这里已了解“暴力匹配”算法)

①当p0,p1……pj-1与si-j,si-j+1,……si-1匹配,但pj!=si时,j不必回到0开始匹配

②而是分析P串本身的性质,让“j少回溯一些”,这就和next[j]数组的求值有关

③……(果然看懂和写出来不是一个段位的,图书馆要关门了,先写到这)

附上自己实现代码

#include <iostream>
#include <string>
using namespace std;
//KMP算法,分析短串P中本身的性质,寻找“前缀==后缀的最长串”,从而令索引j少往回走一些
void getNext(char *p, int next[]){
int k=-;
int j=;
next[]=-;
int pLen=strlen(p);
while(j<pLen-){
if (k==-||p[k]==p[j]){
j++;
k++;
next[j]=k;
}else
k=next[k];//这里有点晦涩啊,但正是递归的精华所在
}
}
int KmpSearch(char *s, char *p){
int i=,j=;
int sLen=strlen(s);
int pLen=strlen(p);
int *next=new int[pLen];
getNext(p,next);
while (i<sLen && j<pLen){
if (j==- || s[i]==p[j])//这里j=-1还不理解
{
i++;
j++;
}else
j=next[j];
}
delete next;
if(j==pLen)
return i-j;
else
return -;
} int main()
{
char *s1="bbc abcdab abcdabcdabde";
char *s2="abcdabd";
cout<< KmpSearch(s1, s2) <<endl;
return ;
}

【基本算法】 KMP文本串模式串的字符串匹配算法的更多相关文章

  1. 模板—字符串—KMP(单模式串,单文本串)

    模板—字符串—KMP(单模式串,单文本串) Code: #include <cstdio> #include <cstring> #include <algorithm& ...

  2. KMP算法 KMP模式匹配 一(串)

    A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB  ...

  3. 问题 1690: 算法4-7:KMP算法中的模式串移动数组

    题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...

  4. KMP算法(改进的模式匹配算法)——next函数

    KMP算法简介 KMP算法是在基础的模式匹配算法的基础上进行改进得到的算法,改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向 ...

  5. POJ 3167 Cow Patterns(模式串浮动匹配)

    题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...

  6. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  7. 4种字符串匹配算法:KMP(下)

    回顾:4种字符串匹配算法:BS朴素 Rabin-karp(上) 4种字符串匹配算法:有限自动机(中) 1.图解 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R ...

  8. KMP Algorithm 字符串匹配算法KMP小结

    这篇小结主要是参考这篇帖子从头到尾彻底理解KMP,不得不佩服原作者,写的真是太详尽了,让博主产生了一种读学术论文的错觉.后来发现原作者是写书的,不由得更加敬佩了.博主不才,尝试着简化一些原帖子的内容, ...

  9. KMP字符串匹配算法详解

    KMP算法利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). Next()函数 ...

随机推荐

  1. oracle 11g 表空间使用率

    Oracle数据库表空间使用量查询: select b.file_name 物理文件名,b.tablespace_name 表空间,b.bytes/1024/1024 大小M,(b.bytes-sum ...

  2. oracle 几个时间函数探究

    近来经常用到时间函数,在此写一个笔记,记录自己的所得,希望也对您有所帮助. 1.对于一个时间如 sysdate:2015/1/30 14:16:03如何只得到年月日,同时它的数据类型不变化呢? 最容易 ...

  3. Android--从相册中选取照片并返回结果

    启动系统相册去选择图片 //从相册中选取的方法 private void selectPhoto(){ Intent intent = new Intent(Intent.ACTION_PICK); ...

  4. hdu 2680 Choose the best route

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...

  5. hdu 1381 Crazy Search

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1381 Crazy Search Description Many people like to sol ...

  6. android开发分辨率问题解决方案

    dpi是什么呢?dpi是“dot per inch”的缩写,每英寸像素数.四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extr ...

  7. [转]ubuntu 12.04添加launcher方法

    [转]ubuntu 12.04添加launcher方法 http://www.cnblogs.com/Jerryshome/archive/2012/08/21/2649500.html 对ubunt ...

  8. Qt5 程序发布打包

    关于qt5在win7下发布 & 打包 ----------------------------------------------------------------------------- ...

  9. ActiveX控件的基本操作方法以及如何在VS2010下使用控件

    在此,小编就介绍下ActiveX控件的基本操作方法以及如何在VS2010下使用控件,我们以一个程序为例, (1)      打开VS2010编译器(右键以管理员身份运行,因为ActiveX需要注册), ...

  10. OC中数组类NSArray的详解,常用属性和方法(一)

    数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA