【扩展KMP算法】教程文章相关的互联网学习教程文章

KMP算法

关于KMP算法,看了很多博客,自己也做了一些字符串匹配之后,总算弄懂一些了,但是可能还要进一步深入研究,先写一部分吧,这部分足够应对笔试的nextval和next问题了。关于如何求next:先给出一个字符串“ababaabab” j 1 2 3 4 5 6 7 8 9 i a b a b a a b a b next 0 1 1 2 3 4 2 3 4nextval 0 1 0 1 1 4 1 0 1next怎么求呢:首先,要了解两个概念:"前缀"和"后缀"...

KMP算法【代码】

看了一晚上才算看明白,明天继续看从头到尾彻底理解KMPpublic class KmpSearch {public static int indexOf(String s, String p) {if (p.length() == 0) return 0;int[] next = new int[p.length()];getNext(p, next);int i = 0;int j = 0;int sLen = s.length();int pLen = p.length();while (i < sLen && j < pLen) {if (j == -1 || s.charAt(i) == p.charAt(j)) {i++;j++;} else {j = next[j];}}if (j == pLen) {return i - j;} ...

深入理解KMP算法【图】

首先从直观上看KMP存在的价值:一般在遇到字符串匹配的问题的时候,一种朴素的比较方式就是int BFMatch(char *s,char *p) {int i,j;i=0;while(i<strlen(s)){j=0;while(s[i]==p[j]&&j<strlen(p)){i++;j++;}if(j==strlen(p))return i-strlen(p);i=i-j+1; //指针i回溯}return -1; }S: ababcababa P: ababa BF算法匹配的步骤如下 i=0 i=1 ...

KMP算法学习笔记【代码】

KMP算法 从零开始大部分来自他人博客,蒟蒻只是总结学习引言 字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置.char *str = "bacbababadababacambabacaddababacasdsd"; char *ptr = "ababaca";暴力解法如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符; 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被...

KMP算法详解【代码】【图】

KMP算法主要用于解决包含问题,即存在两个字符串str1和str2,判断str1字符串中是否包含字符串str2,包含则返回str2对应在str1中的字符串的首字符的位置,否则返回-1;例如:str1="abc123def" str2="123d" ,str1的长度为N, str2的长度为M,则返回3; 那么如何解决这类问题呢?正常的解法所用时间复杂度为O(N*M),即一个一个字符进行匹配,匹配不成功,则str1索引向后移动一位,str2重新从首字符进行匹配。 使用KMP算法...

KMP算法【代码】

KMP算法1. 算法介绍KMP是一个解决模式串在文本串是否出现过,若出现过,最早出现的位置的算法Knuth-Morris-Pratt 字符串查找算法,简称“KMP算法”,此算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977年联合发表,故使用三人姓氏命名KMP方法利用之前判断过的信息,new 一个数组,保存模式串前后最长公共子序列的长度,每次回溯时,通过next数组找到,前面匹配过的位置,省去了大量的实践2. 应用场景-字符串匹配s...

字符串匹配——朴素算法、KMP算法【图】

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap。下面分析朴素搜索算法和KMP这两种方法并给出其实现。假设原字符T串长度N,子串P长度为M。 1.NAIVE—STRING—MATCHING. 朴素算法,该方法又称暴力搜索,也是最容...

字符串与模式匹配算法(三):KMP算法【代码】【图】

一、KMP算法介绍  KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯。回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj位置对齐。从左向右逐个进行比较,发现 pi 处的字符a 与 tj+1 处字符b发生失配。同时也表明 P(p0,p1,...,pi-1) 与 T‘(tj,tj+1,...,tj+i-1) 是完全匹配的,这一部分子串在图中用字母u标示出。由于发生失配,随即移动模式字符串并进...

字符串匹配——KMP算法(C++)【代码】

源代码:#include<cstdio> #include<cstring> #include<iostream> usingnamespace std; string s1,s2; int m,n,k(0),next[1001]; //在Next数组中,存储的是匹配失败后,上一位应该跳跃到的节点编号。 int main() {getline(cin,s1);getline(cin,s2);m=s1.size();n=s2.size();next[0]=0; //第一个字符之前,不存在可比较的字符。for (int a=1;a<n;a++) //在C++中,字符串实际上以开头为0的、字符数组的形式存在。 {while (k>0&&s...

模式匹配- KMP算法

■Knuth-Morris-Pratt(KMP)算法-听我的,别总重来。发表于1977年的KMP算法是一种高效的匹配算法,消除了BF算法中回溯问题,即每次移动的距离可以不是1而是更大的数,也不需要回溯,BF算法的时间复杂度是O(m*n),而KMP算法的时间复杂度是O(m+n)。 在BF算法中,用模式串去和目标串比较时,如果发生不匹配,就要回溯到起始位置,然后后移。KMP算法的思想是,设法利用这个已知信息,跳过前面已经比较过的位置,继续把它向后移,从而提...

扩展KMP算法

问题描写叙述:给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每一个A[i](0<=i<lenA),求出A[i..lenA-1]与B的最长公共前缀长度,记为ex[i](或者说,ex[i]为满足A[i..i+z-1]==B[0..z-1]的最大的z值)。扩展KMP能够用来解决非常多字符串问题,如求一个字符串的最长回文子串和最长反复子串。 算法解说:设next[i]为满足B[i..i+z-1]==B[0..z-1]的最大的z值(也就是B的自身匹配)。设眼下next[0..lenB-1]与ex[0...

学习KMP算法时想到的另一种好方法

KMP是一种简化的字符串匹配的方法,思路并没有那么简单。对于简单的给定的字符串和子串,用c++string库中的substr方法就可以很简单的做到字符匹配!比如pta上的7-3 病毒感染检测 就可以用如下代码实现:#include <iostream>#include <string.h>using namespace std;void reverse(string &a){//将字符串反转 int m=a.length(); string d=a; for(int i=0;i<m-1;i++){ a[i]=a[i+1]; } a[m-1]=d[0];}int compare(string &c,string &a...

数据结构20:KMP算法(快速模式匹配算法)详解【代码】【图】

通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。"KMP"算法相比于"BF"算法,优势在于: 在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;并且可以在O(n+m)的时间数量级上完成...

KMP算法【代码】

算法模板//Author LJH //www.cnblogs.com/tenlee #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define clc(a, b) memset(a, b, sizeof(a)) using namespace std;const int inf = 0x3f; const int INF = 0x3f3f3f3f; const int maxn = 5e6+5;char par[maxn], son[maxn]; int next[maxn];void get_next()...

KMP算法【代码】【图】

KMP算法是字符串匹配功能的一个优化。所谓字符串匹配的问题意思是说,给一个字符串和一个匹配串,判断这个匹配串是否被这个字符串包含。或者说求匹配字符串在给的字符串中出现的位置。 在C语言中,strstr函数就是这个字符串功能的实现,既然你看到了这篇博客,我就默认你已经了解strstr函数。 举个例子:给一个字符串 string:abcabcabcabcacabxy 求字符串pattern:abcabcacab在string中字符串的位置。 如果按照暴力算法,就是一个...