您的位置:首页 > 其它

KMP模板

2016-07-02 00:10 253 查看
思路来自Matrix67:http://www.matrix67.com/blog/archives/115

void pre(string str){
int j=-1;
next[0]=-1;
for(int i=1;i<str.size();i++){
while(j>=0&&str[j+1]!=str[i]) j=next[j];
if(str[j+1]==str[i]) j++;
next[i]=j;
}
}
int kmp(string str1,string str2){
pre(str2);
int ans=0;
int j=-1;
for(int i=0;i<str1.size();i++){
while(j>=0&&str2[j+1]!=str1[i]) j=next[j];
if(str2[j+1]==str1[i]) j++;
if(j==str2.size()-1){//找到一次
ans++;
j=next[j];//继续向后找
}
}
return ans;
}

void get_next()
{
int k=-1,j=0;
next[0]=-1;
while(j<pl)
{
if(k==-1||p[j]==p[k])
{
j++;k++;
next[j]=k;
}
else
k=next[k];
}
}
int KMP()
{
int i=0,j=0;
get_next();
while(j<pl&&i<sl)
{
if(j==-1||s[i]==p[j])
{
i++;j++;
}
else j=next[j];
if(j==pl)
{
sum++;j=next[j];
}
}
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: