一.学习KMP 的 i,j指针 的秘密之前,需要熟知next[]数组的原理以及它与模式串P所有前缀的关系
KMP之:【next数组原理】【模板速记】_bei2002315的博客-CSDN博客
二.再先学一下暴力的模式匹配算法,熟知暴力算法中 i,j指针是如何运转的
【王道】【4.2.1简单的模式匹配算法】【暴力匹配】_bei2002315的博客-CSDN博客
三.正式进入KMP匹配的学习
四.考研版本的KMP算法:
/*
KMP算法考研版本写法
*/
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int ne[N];
char s[N],p[N];
int n,m;
void get_next(char *p,int *ne)
{
ne[1]=0; //以0开头
int i=1,j=0; //y总版本i是从2开始的,因为哪里是以-1,0开头此处打算以0,1开头
while(i<m) //m-1次,因为最后一个ne 被第一个ne挤出去了
{
if(j==0||p[i]==p[j])
{
++i; //i是从2开始的,一直到n
++j;
ne[i]=j;
}
else //只要j存在并且p[i]!=p[j+1],就回退
{
j=ne[j];
}
}
}
void kmp(char *s,char *p,int *ne)
{
int i=1,j=1;
while(i<=n&&j<=m)
{
if(j==0||s[i]==p[j])
{
++i;
++j;
}
else{
j=ne[j];
}
if(j>m)
{
cout<<i-m<<" "; //输出在主串中出现的位置
}
}
}
int main()
{
cin>>s+1>>p+1;
n=strlen(s+1);
m=strlen(p+1);
get_next(p,ne);
kmp(s,p,ne);
return 0;
}