KMP算法
今天终于基本掌握了kmp(想在网上找好的学习资源真的不容易)
假如我们有一个字符串S和模板串P,我们想在S中找到和P一模一样的子串,这不难,我们直接暴力遍历即可,但这样做的时间复杂度是O(nm),所以为了优化这个问题,kmp就体现了它的优越性.
这里我推荐去看一个印度小哥讲解的视频,直接一点即通:https://www.bilibili.com/video/av3246487/?spm_id_from=333.788.videocard.1
这里我再贴上我所认为的最简单的代码,其关键是找next数组(只对模板串进行分析,找到每个位置的相同前后缀)!
#include <iostream> #include <cstdio> #include <cstring> #include <string.h> #include <math.h> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #define ll long long const int N=1e6+10; using namespace std; typedef pair<int,int>PII; int n,m; char s[N],p[N]; int ne[N]; int main(){ cin>>s+1>>p+1; //下标从一开始 n=strlen(s+1); m=strlen(p+1); memset(ne,0,N); //求next数组 for(int i=2,j=0;i<=m;i++){ while(j!=0 && p[i]!=p[j+1]) j=ne[j]; if(p[i]==p[j+1]) j++; ne[i]=j; } //s与p进行匹配 for(int i=1,j=0;i<=n;i++){ while(j!=0 && s[i]!=p[j+1]) j=ne[j]; if(s[i]==p[j+1]) j++; if(j==m){ cout<<i-m+1<<endl; //下标从1开始 j=ne[j]; //继续向后查找 } } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮