【C++kmp算法】教程文章相关的互联网学习教程文章

KMP算法2【代码】

给定一个主串s,一个子串sub,将主串中的所有子串替换成replaceStr,并将最终结果输出来。 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 int next[20];5 void getNext(char pattern[])6 {7 int k=-1,len=strlen(pattern),j=0;8 next[0]=-1;9 while(j<len){ 10 if(k==-1||pattern[k]==pattern[j]){ 11 k++;j++; 12 next[j]=k; 13 }else{ 14 k=n...

蓝书(算法竞赛进阶指南)刷题记录——POJ1961 Period(KMP算法)【图】

题目:POJ1961. 题目大意:给定一个长度为n的字符串,求出对于每一个前缀满足最大循环次数大于1,该前缀的长度与最大循环次数. 注:一个串的一个i最小的前缀满足重复次与完全相同,那么被称为的最小循环元,k被称为的最大循环次数. 最小循环元问题是KMP的一个很经典的应用,所以先求出原串的next数组. 我们回忆next数组的含义,next数组表示的是最长的一个既是前缀又是后缀的串的长度.那么考虑应用这个数组的一些性质,很容易猜到一...

KMP算法【代码】【图】

概述 KMP(Knuth-Morris-Pratt)算法是一种用来解决字符串匹配问题的算法,时间复杂度为O(n+m),主要思想是当模式串与主串发生失配时,不必从头开始匹配,而是滑动到已经匹配的部分 next数组 在KMP算法中,next数组用来存储一段子串最大相等前后缀的长度加1,例如长度为i+1的字符串,它的最大相等前后缀分别为0~k和i-k~i,则next[i]=k,这里k小于i。 问题在于如何去求next数组,遍历的话KMP算法就没什么意义了,但仔细观察就可以发现...

KMP 算法【代码】

分析: //先占个坑,有闲时再来补上 实现:#include <string.h> #include <malloc.h> #include <stdio.h>#define ERROR 0 #define OVERFLOW -2int *get_nextval(char *s) {int i, j;int *nextval;if (!(nextval = (int*)malloc(strlen(s) * sizeof(int))))exit(OVERFLOW);i = 0;j = -1;nextval[0] = -1;while (i < strlen(s)){if (j == -1 || s[i] == s[j]){i++;j++;if (s[i] == s[j])nextval[i] = nextval[j];elsenextval[i] = j;...

KMP算法与其应用

KMP字符串匹配 题目链接:https://www.luogu.org/problemnew/show/P3375 1.nxt数组: nxt[x]:以x位结尾的字符串为后缀能匹配到的最长前缀。 求法见代码:nxt[1]=0;int j=0;for(int i=2;i<=n2;i++){while(j&&s2[j+1]!=s2[i]) j=nxt[j];//这里是一个找最长前缀的过程 if(s2[j+1]==s2[i]) j++;nxt[i]=j;} 然后要匹配s1和s2。其实和求nxt的方法是一样的呢。注意f[i]:i结尾的几位和s2前几位相同(最长前缀) 这里注意f[i]==n2时就是匹...

KMP算法题记【代码】

照着这篇博客刷一下。 自己也做一下笔记 poj 3461 Oulipo? 基于两个串a和b,问a在b中重复了几次。要对KMP进行一些修改,其实只是在模式串匹配完之后,ans++,并且让模式串的j回到原来的位置重来而已。#include <cstdio> #include <cstring> using namespace std; #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define maxN 1000005 int nxt[maxN], n, m, cas, ans; char a[maxN], b[maxN]; void getNxt(char *b, int m, int *nxt...

KMP算法(C语言)【代码】

#include <stdio.h> #include <string.h>int KMP(char *t, char *p, int *next) {int a,i,j;a=0; i=0; j=0;while(i<strlen(t) && a<strlen(p))if (t[i]==p[a]) { a++; i++; }elseif (a!=0) a=next[a] ;else i++;if (a==strlen(p)) return i-a+1 ;else return -1; }void c_next(char *p, int *next){/*?????£ê?′?μ?next*/int i,j,k;next[0]=-1;i=1; k=-1;while (i<=strlen(p))if ((k==-1)||(p[i-1]==p[k])){next[i]=k+1; k+...

KMP算法——解决字符串匹配问题

ZZ给两个链接帮助大家理解KMP https://www.bilibili.com/video/av11922005 https://blog.csdn.net/starstar1992/article/details/54913261 其实KMP算法与普通字符串匹配方法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(m*n)下降到O(m+n)。 比如下面两个字符串,(我们称str为目标串,ptr为模式串)char str = "bacbababadababacambabacaddababacasdsd"; char ptr = "ababa...

KMP算法(查找子串)【图】

KMP算法的核心思想:避免不必要的回溯,主串不进行回溯,子串在每个位置的回溯位与当前位置之前字符与自身开始几位的字符匹配程度来决定。如上图所示,当在下标i=5处失配。由图可知: P[0] ... P[j - 1] == S[i - j] ... S[i - 1] P[0] ... P[k - 1] == S[i - k] ... S[i - 1] S[i - k] ... S[i - 1] == P[j - k] ... P[i - 1] 可推出:P[0] ... P[K - 1] == P[j - k] ... P[j - 1] 则j不必退回0,i也不必退回 i - j + 1处,只需...

[牛客算法系列] KMP算法【代码】

题目给定两个字符串source 和 match, 长度分别为 N 和 M。实现一个算法,如果字符串source 中,含有子串match, 则返回match 在 source 中的开始为位置,不含有返回-1. 举例 source = “acbc”, match = “bc” , 返回2. source = “acbc”, match = “bcc” , 返回-1; 要求,如果match 的长度大于source 的长度(M > N)source 必然不会含有match, 可直接返回-1。但如果N >= M ,要求时间复杂度为O(N).分析代码最普通的解法是从左...

kmp算法

理解关键: 1.时间复杂度o(m+n),主串不回溯,一直向前推进。模式串通过next[]表进行下标跳转 2.模式串next[]数组构造。 求解当前下标i的next[i]的关键是找出p[0]到p[i-1]字符串中,以p[i-1]结尾的最长子串,该子串满足调条件p[0]-p[k]与p[i-1-k]-p[i-1]相同,则next[i] = k; next表构造代码如下: #define MAX_PATTERN_LEN 20 int next[MAX_PATTERN_LEN] = { 0 }...

单模式串匹配----浅谈kmp算法【代码】【图】

模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现; p.s. 模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串;在这篇博客的代码里,s1均为文本串,s2均为模式串;一般地,文本串长度不小于匹配串;(否则无意义) 很显然可以得到一个暴力的做法 :for i : 1~lenth_of_s1 {//枚举匹配串在文本串中的开始位置for j : 1~lenth_of_s2if(s2[j]!=s1[i+j-1]) break;if j>lenth_of_s2 //...

KMP算法模板【代码】

sub[ ]代表子串,str[ ]代表原串,next[ ]代表当sub[i] != str[j]时,子串需要跳到的地方,实现代码如下: 获取next数组的代码: 1 void GetNext()//求子串中的相同的真前缀和真后缀2 {3 memset(next, 0, sizeof(next));4 next[0] = -1;5 int i = 0,j = -1;6 int sub_len = strlen(sub);7 while(i < sub_len)8 {9 if(j == -1 || sub[i] == sub[j]) 10 { 11 i++; 12 ...

kmp算法【代码】

直接把求next数组跟标记平移放到一起#include <iostream> #include <vector> #include <stdlib.h> using namespace std;bool kmp( vector<char>& str1, vector<char>& str2 ) {vector<int> next(str2.size());int i = 1;int k = 0;while ( i < str2.size() ) {if ( str2[i] == str2[k] ) {next[i] = next[i-1]+1;i++;k++;}else {k = next[i++]; // write like "k = 0; i++;" is easier to understand}}for (int j = 0; j < next....

KMP算法总结【代码】【图】

【KMP简述】 主串长度为n,模式串长度为m,朴素的算法下,对于主串S的每一位S[i]都要往后扫描m个字符,所以时间复杂度为O(nm)。 对于KMP算法,它的时间复杂度降到了O(m+n)。原理是用一个next数组预处理了主串的局部匹配信息(最长相同前后缀长度),在进行主串与模式串的匹配时,保证了主串一直往后遍历不回溯,仅改变指向模式串的指针位置。 【算法原理详解】 来看这样一个例子, 主串A B C A B C A C A A B, 模式串A B C A...