KMP简提
KMP是一种复杂度为O(n+m)的字符串匹配算法,最难理解的部分就是Next数组的求解
Next数组即为模板串的每个位置对应的 0~i 位置的前缀与后缀中的最大公共部分,依此公共部分来实现模板串的移动匹配,依此大幅度降低了字符串匹配的复杂度。
Next数组的其实就是对模板串相同前缀后缀的一个递归匹配实现。
推荐一个理解Next数组的博客:https://www.cnblogs.com/tangzhengyue/p/4315393.html
附上代码:
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int Next[maxn],f[maxn]; void get_Next(string p){ Next[0]=0; for (int i=1,j=0; p[i]; i++){ while(j>0 && p[j]!=p[i]) j=Next[j-1]; if(p[i] == p[j]) j++; Next[i]=j; // printf("%d ",j); } } int Kmp(string t,string p){ int ans=0,len=t.length(),l=p.length(); for (int j=0,i=0; i<len; i++){ while(j>0 && t[i]!=p[j]) j=Next[j-1]; if(t[i]==p[j]) j++; f[i]=j; if(f[i]==l) ans++,j=Next[j-1]; } return ans; }
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; struct KMP{ int Next[maxn],f[maxn]; void get_Next(string p){ Next[0]=0; for (int i=1,j=0; p[i]; i++){ while(j>0 && p[j]!=p[i]) j=Next[j-1]; if(p[i] == p[j]) j++; Next[i]=j; } } int Kmp(string t,string p){ int ans=0,len=t.length(),l=p.length(); for (int j=0,i=0; i<len; i++){ while(j>0 && t[i]!=p[j]) j=Next[j-1]; if(t[i]==p[j]) j++; f[i]=j; if(f[i]==l) ans++,j=Next[j-1]; } return ans; } }kp;