看了两个晚上的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. wamp环境搭建

    php 进入php安装目录. 修改php.ini-developement为php.ini 配置扩展目录为你的PHP安装目录下的ext目录,在我这里是 extension_dir = "C: ...

  2. spring 3 的 @value的使用

    Spring 3支持@value注解的方式获取properties文件中的配置值,大大简化了我们读取配置文件的代码.使用方式如下: 1.首先必须要配置properties文件的加载bean:在spri ...

  3. pcre 使用

    1.主页地址:http://www.pcre.org/     下载pcre-7.8.tar.bz22.解压缩:     tar xjpf pcre-7.8.tar.bz23.配置:     cd p ...

  4. 5 给我们的c#程序添加注释

    注释是你的程序中的一个重要部分.在程序中添加注释是用来告诉你和其他人你的程序是做什么用的,你的思路是怎样的.注释可以用你熟悉的中文进行添加. 当你想暂时把你程序中的某些语句去掉的时候,不需要把他们删除 ...

  5. 【转载】about slack

    About Slack slack is the difference b/w the REQUIRED TIME and the ARRIVAL TIME. 1.WHAT IS SLACK WITH ...

  6. php对象

    在php中,必须使用class关键字明确的声明对象,然后在对象类中定义数据类型和方法. 示例: class Color{ public $value; public static $RED = &qu ...

  7. 推荐一款系统软件:Unity tweak tool

    功能很多慢慢体会 在软件中心搜索unity tweak tool安装

  8. JAVA标签的使用跳出循环

    public static void main(String args[]) { int i=10,j=10; outer: while (i > 0) { inner: while (j &g ...

  9. javascript各种模式解析

    1.工厂模式: 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创建 ...

  10. 【桌面程序搞界面再也不怕了】:迅雷BOLT入门(一)开篇 附程序和源码

    本来想多蛤一下前因后果,突然意兴阑珊不想多说啦,直接帖效果吧. 这个是用迅雷BOLT把原来写的一个IE拦截器的界面重写了一下.界面效果是直接从单位的大屏系统改过来的,其中文本框部分,还请设计大屏的小姑 ...