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

KMP算法-C语言实现【代码】【图】

KMP完整代码 #include <stdio.h> #include <stdlib.h> #include <string.h>int* build_prefix_table(const char* str_pat, int len_pat) {int* prefix_table = (int*)calloc(1, sizeof(int) * len_pat);int* tmp_table = (int*)calloc(1, sizeof(int) * len_pat);if (NULL == prefix_table || NULL == tmp_table) {perror("calloc()");exit(1);}int i = 0, j = 1;tmp_table[0] = 0;while (j < len_pat) { // O(len_pat)if (...

kmp算法【代码】

KMPfor (int i = 2, j = 0; i <= m; i ++ ){while (j && p[i] != p[j]) j = ne[j];if (p[i] == p[j]) j ++ ;ne[i] = j;}for (int i = 0, j = 0; i <= n; i ++ ) {while (j && s[i] != p[j]) j = ne[j];if (s[i] == p[j]) j++;if (j == m){// 匹配成功后的逻辑cout << i - m + 1 << endl;break;}}

【数据结构 - 串 - KMP算法】next数组的推导【C语言】【代码】【图】

KMP算法中,当主串字符s[i]不等于子串字符t[j]时,希望知道s[i]接下来与子串哪个字符比较目录 1 假设2 推导3 next数组的定义4 解释5 代码实现6 例子7 补充8 参考文献1 假设 主串S:‘s[1]s[2]…s[n]’子串T:‘t[1]t[2]…t[m]’一般地,n>=m 2 推导已有部分匹配结果: 's[i-j+1]s[i-j+2]...s[i-1]' = 't[1]t[2]...t[j-1]' 则必有 's[i-k+1]s[i-k+2]...s[i-1]'='t[j-k+1]t[j-k+2]...t[j-1]' 当s[i]不等于t[j]时,子串T需要向右移动...

KMP算法【代码】

String 字符串 KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 void get_next(string s){int k = -1;next[0] = -1;for(int...

字符串学习(KMP算法)【代码】【图】

对于字符串问题一直只知道使用模板,脱离了模板题就不知道该怎样更改板子。 一定是没有理解清楚算法本身的含义,所以这几天详细学习了一下各个算法本身及其一些比较普遍的拓展。希望能够开阔以后的解题思路。 KMP算法详解 人眼优化字符串匹配 我们串中的位置指针i,j来说明,第一个位置下标以0开始,我们称为第0位。下面看看,如果是人为来寻找的话,肯定不会再把i移动回第1位,因为主串匹配失败的位置(i=3)前面除了第一个A之外再也...

KMP算法--纯代码【代码】

直接上代码,都在注释里了。 1 #include <stdio.h>2 #include <stdlib.h>3 4 //KMP5 //判断已经不等过的,不在重新判断6 //判断过已经相等的,也不再重新进行判断7 /*8 与朴素模式相比,KMP算法省去了回溯的重复问题,对判断到的相等或者不等的情况进行合理重复利用,避免多次判断的时间复杂度提升。9 */ 10 11 //算法代码实现 12 //这段代码的目的就是为了计算出当前要匹配的串T的next数组 13 void get_next(char * T, int *...

队列和堆栈 KMP算法【代码】

队列和堆栈 队列:是一种先进先出的线性表 利用他的性质可以做一些O(n)的简化,从队头出队,队尾进队; 堆栈:是一种后进先出的线性表 ,在栈顶进行操作,在程序设计时 如果需要按照保存数据时的相反顺序来使用数据,用栈来实现; 一般用数组来实现对队列和堆栈的操作。 下面进行最简单的数组模拟堆栈(不是完全用数组实现)(可以用数组完全模拟实现 ) //进行队列和堆栈的操作 stack<char>st1,st2 //首先 声明一下字符数组的类...

KMP算法模板【代码】【图】

概述模板出自kuangbin的博客 典型应用:给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 (1) 头文件1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5+10; 4 int Next[N]; 5 char S[N],T[N]; // S:主串 T:模式串 6 int slen,tlen;(2) getNext()函数 1 void getNext()2 {3 int j,k;4 j = 0; k = -1; Next[0] = -1;5 while(j < tlen)6 {7 ...

KMP算法【代码】【图】

字符串匹配,给定一个文本串S和一个模式串P,如何找到P在S中的位置? BF算法(暴力匹配算法)思路:假设文本串S匹配到i位置,P匹配到j位置。如果文本串S的i位置的元素与模式串P的j位置的元素相匹配,则继续让文本串的下一个元素和模式串的下一个元素比较是否匹配;如果S的i位置的元素与模式串P的j位置的元素不匹配,i回溯到上一次开始匹配的位置的下一个位置,j回溯为0,如此循环,直到找到匹配的字符串为止。如果发生匹配,j等于模...

KMP算法【代码】

KMP算法 再此记录一下自己写的KMP算法代码,防止以后忘记。 #include<iostream> #include<cstring> using namespace std;int *get_next(char *pattern) {int n=strlen(pattern);int *next=new int[n];next[0]=0;int len=0;int i=1;while(i<n){if(pattern[i]==pattern[len]) {len++;next[i]=len;i++;}else{if(len>0) len=next[len-1];else{next[i]=len;i++;}}}for(int i=n-1;i>0;i--) next[i]=next[i-1];next[0]=-1;return next; }v...

KMP算法——让你全面透彻理解KMP算法【寻找子串第一次出现在主串中的位置(C++实现)】【代码】【图】

文章目录 理论背景普通的算法(穷举法)KMP算法kmp算法思想代码实现代码解析理论背景 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)...

KMP算法【图】

KMP算法 字符串算法给定两个字符串s1和s2,求s2在s1中所有的出现位置 暴力(O(n*m)): #include<bits/stdc++.h>using namespace std;string s1,s2;int main(){ scanf("%s%s",s1,s2); int n1=strlen(s1),n2=strlen(s2); for(int i=1;i<=n1-n2+1;i++){ bool pd = 0; for(int j=1;j<=n2;j++) if(s1[i+j-1]!=s2[j]){ pd = 1; break; } if(!pd) print("%d",i+n2-1); } ...

带你轻松学会 KMP 算法【代码】【图】

文章目录 简介暴力匹配(朴素模式匹配BF)KMP 算法简介 ??KMP算法是一种字符串模式匹配算法, 不同的来源讲解方式也不一样,很容易混乱,在这里以一种特殊的方式来讲解KMP算法,希望大家不再被这个问题所困扰。 ??KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯, 从而使算...

算法(Java实现)—— KMP算法【图】

KMP算法 应用场景 字符串匹配问题 有一个字符串str1 = “ hello hello llo hhello lloh helo” 一个子串str2 = “hello” 现要判断str1是否含有str2,如果存在,就返回第一次出现的位置,如果不存在就返回-1. 暴力匹配算法 思路: 假设str1匹配到i位置,str2匹配到j位置,则有:如果当前字符匹配成功(str1[i] = str2[j]),则i++,j++ 继续匹配下一个字符后面如果匹配失败,回到str1从当前位置向后匹配,重复上述步骤直到在str1中匹...

kmp算法模板和基础应用【代码】

模板题:https://www.acwing.com/problem/content/833/ 题意:给两个字符串长度及序列,求第一个串在第二个串中出现的位置3 aba5 ababa求next数组: for(int i=2,j=0;i<=m;i++){while(j&&p[i]!=p[j+1])j=ne[j];if(p[i]==p[j+1])j++;ne[i]=j; }kmp匹配过程 for(int i=1,j=0;i<=n;i++){while(j&&s[i]!=p[j+1])j=ne[j];if(s[i]==p[j+1])j++;if(j==m) j=ne[j]; //避免下次的p[j+1]越界 }代码: #include<iostream> #include<cstdio> u...