KMP算法的c++实现

来源:互联网 发布:美工的进阶之路 编辑:程序博客网 时间:2024/06/06 19:27
/* 实现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;} 

原创粉丝点击