kmp一种快速的字符串匹配算法,不是很好理解,感觉B站有个视频做的特别好,跟大家分享下
视频连接:http://www.bilibili.com/video/av3246487/?from=search&seid=13990827196865923065
kmp模板
代码:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
const int maxn=10000;
int fail[maxn];
void getFail(string zi)
{
fail[0]=0,fail[1]=0;
for(int i=1;i<zi.size();i++){
int j=fail[i];
while(j&&zi[i]!=zi[j])
j=fail[j];
fail[i+1]=zi[i]==zi[j]?j+1:0;
}
}
void kmp(string fu,string zi)
{
getFail(zi);
int j=0;
for(int i=0;i<fu.size();i++){
while(j&&zi[j]!=fu[i]) j=fail[j];
if(zi[j]==fu[i]) j++;
if(j==zi.size()) printf("找到了下标位置是:%d\n",i-zi.size()+1);
}
}
int main()
{
string fu;
string zi;std::ios::sync_with_stdio(false);//这据话提高cin的速度
while(cin>>fu>>zi)
kmp(fu,zi);
}