学习KMP的话除了看视频之外,推荐一个写的很好的博客。
blog
My blog
发现自己没有贴过代码。补一下。
#include<bits/stdc++.h>
#define Max 10001
using namespace std;
int nex[Max];
int Slen,Plen;
//下标从0开始
void Get_Next(string p,int nex[])
{
Plen=p.length();
int i=0,j=-1;
nex[0]=-1;
while(i<Plen)
{
if(j==-1||p[i]==p[j])
{
i++;
j++;
nex[i]=j;
}else j=nex[j];
}
}
//在s中找到p第一次出现的位置
int Kmp(string s,string p,int nex[])
{
Get_Next(p,nex);
int i=0,j=0;
Slen=s.length();//主串
Plen=p.length();//匹配串
while(i<Slen && j<Plen)
{
if(j==-1||s[i]==p[j])//p的第一个字符不匹配或者 s[i]=p[j]
{
i++;
j++;
}
else//
{
j=nex[j];//回溯
}
}
if(j==Plen) return i-j;
else return -1;
}
int main()
{
string s="iamsocooooool";
string p="ooooo";
Get_Next(p,nex);
cout<<Kmp(s,p,nex)<<endl;
return 0;
}