您的位置:首页 > 编程语言 > C语言/C++

KMP算法的c++实现

2017-05-29 17:37 204 查看
/*
实现KMP主要有下面两个步骤:
1.构建next数组,形如 abcabc的字符串,创建一个数组next,数组的下标表示截这么长的字符串所对应的对称子串的长度。
2.匹配字符串。
*/
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string str,com;
int next[1005];
int kmp() {
int i=0,j=0;
int sum=0;
while(i<str.size()) {
if(str[i]==com[j]) {
i++;
j++;
}
else{
if(j==0) i++;
else j=next[j-1];
}
if(j==com.size()-1)  sum++,j=0; //如果存在找 ababab  aba 这种情况 ,j=next[j];
}
return sum;
}
int main() {
//freopen("test.txt","r",stdin);
cin>>str;
cin>>com;
next[0]=0;   //第一个字符的值一定为0,因为不可能有对称的子串
for(int i=1;i<com.size();i++) {
int j=next[i-1];  //j为什么要等于前面next[i-1]?想一想我前面如果对称子串长度为X,我只需要知道下一个com[x+1]是否等于com[i];
while(j>0&&com[j]!=com[i]) {
j=next[j];     //这里是节省时间 :  这种情况 ABDADABDABD,当1.ABDAD和2.ABDAB时候  j=next[j],j就从1开始
}
if(com[i]==com[j])
j++;
next[i]=j;
}
int sum=kmp();
cout<<sum<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KMP C++ 实现