字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 下面的的KMP算法的解释步骤,引用于http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 1.
1#include<iostream>2#include<string>3#include<vector>4usingnamespacestd;5intkmp_find(conststring& target,conststring&pattern)6{7constinttarget_length =target.size();8constintpattern_length =pattern.size();9int* overlay_value =newint[pattern_length];10overlay_value[0] = -1;11intindex =0;...
参考 https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm https://www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/
[1] dekai,Lecture 16: String Matching. [2] E. Horowitz, S. Sahni, S. A. Freed, 《Fundamentals of Data Structures in C》. [3] Jake Boxer,The Knuth-Morris-Pratt Algorithm in my own words. 来自:http://www.cnblogs.com/en-heng/p/5091365.html...
KMP 匹配算法是由 "Knuth Morris Pratt" 提出的一种快速的模式匹配算法。 hint:不为自身的最大首尾重复子串长度 1.待解决的问题:假设P为给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这称为模式匹配问题。 (可以给出子串在T中的位置) (下文中提到的P和T分别为子串和目标串) ...
public class KmpAlgorithm { /** * KMP 简单推导 */ @Test public void kmpNextTest1() { String dest = "A"; System.out.println("字符串:" + dest); System.out.println("的部分匹配表为:" + Arrays.toString(buildKmpNext1(dest)));
defKMP_Algorithm(mainstr,modestr,NextArray):i,j=0,0# while not finishwhilei<len(mainstr)andj...
#include <cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<set>#include#include<string>#include<cmath>#include<cstdlib>#include<deque>#include<ctime>#definefst first#definesec second#definelson l,m,rt<<1#definerson m+1,r,rt<...
// C program to implement the KMP pattern search algorithm#include <stdio.h>#include <string.h>#include <ctype.h>intmain() {charstr[64];charword[20]="is";inti=0;intj=0;intc=0;intindex=0;intlength=0; printf("Enter string: "); scanf("%[^\n]s", str);while(str[i]) { str...
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<math.h>#include<bitset>#include<limits.h>#define ls (p<<1)#define rs (p<<1|1)#define mid (l+r>>1)#define over(i,s,t) for(register int i=s;i<=t;++i)#define lver(i,t,s) for(register int i=t...