KMP-类型总结

来源:互联网 发布:js append 编辑:程序博客网 时间:2024/06/06 04:27

KMP:

目的:判断主串是否是模板字符串的子字符串

这里介绍三种方式写KMP:

方式一:

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;char s[10001];int nex[10001];int KMP(int len){int j;nex[1]=j=0;for(int i=2;i<=len;i++){while(j&&s[j+1]!=s[i]) j=nex[j];if(s[j+1]==s[i]) ++j;nex[i]=j;}for(int i=1;i<=len;i++)cout<<s[i]<<" ";cout<<endl;for(int i=1;i<=len;i++)cout<<nex[i]<<" ";cout<<endl;}int main(){int n,len;cout<<"please input n:"<<endl;cin>>n;while(n--){memset(nex,0,sizeof(nex));cin>>s+1;len=strlen(s+1);KMP(len);}}方式二:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;char s[10001];int nex[10001];int KMP(int len){int j;nex[1]=j=0;for(int i=2;i<=len;i++){if(j==0||s[j+1]==s[i]) {j++;i++;nex[i]=j;}else{ j=nex[j];} }for(int i=1;i<=len;i++)cout<<s[i]<<" ";cout<<endl;for(int i=1;i<=len;i++)cout<<nex[i]<<" ";cout<<endl; }int main(){int n,len;cout<<"please input n:"<<endl;cin>>n;while(n--){memset(nex,0,sizeof(nex));cin>>s+1;len=strlen(s+1);KMP(len);}}


方式三:

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;char s[10001];int nex[10001];int KMP(int len){int j;nex[1]=j=0;for(int i=2;i<=len;i++){if(j==0||s[j+1]==s[i]) {++j,i++;if(s[j+1]==s[i]) nex[i]=j;//对nex进行再度升级else nex[i]=nex[j];}else{ j=nex[j];} }for(int i=1;i<=len;i++)cout<<s[i]<<" ";cout<<endl;for(int i=1;i<=len;i++)cout<<nex[i]<<" ";cout<<endl; }int main(){int n,len;cout<<"please input n:"<<endl;cin>>n;while(n--){memset(nex,0,sizeof(nex));cin>>s+1;len=strlen(s+1);KMP(len);}}


那么主串与模板字符串如何比较尼?

int f(int len,int len1)//len:模式串长度;len1:主串长度{     int j=1;//注意j的值     for(int i=1;i<=len;i++)     {      while(j&&s[i]!=s1[j]) j=nex[j];     if(s[i]==s[j]) ++j;     if(j>len1)     {        cout<<"j: "<<j<<"len: "<<len<<endl;        flag=1;        break;} } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl;} 


奋斗OK!让咱们一起看下方式一的完整程序:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;char s[10001],s1[10001];int nex[10001],flag;int KMP(int len){int j;nex[1]=j=0;for(int i=2;i<=len;i++){while(j&&s[j+1]!=s[i]) j=nex[j];if(s[j+1]==s[i]) ++j;nex[i]=j;}for(int i=1;i<=len;i++)cout<<s[i]<<" ";cout<<endl;for(int i=1;i<=len;i++)cout<<nex[i]<<" ";cout<<endl; }int f(int len,int len1){     int j=1;     for(int i=1;i<=len;i++)     {     while(j&&s[i]!=s1[j]) j=nex[j];     if(s[i]==s[j]) ++j;     if(j>len1)     {        cout<<"j: "<<j<<"len1: "<<len1<<endl;        flag=1;        break;} } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl;} int main(){int n,len;cout<<"please input n:"<<endl;cin>>n;while(n--){flag=0;memset(nex,0,sizeof(nex));cout<<"input the model string:"<<endl;cin>>s+1;len=strlen(s+1);KMP(len);cout<<"input the main string:"<<endl;cin>>s1+1;int len1=strlen(s1+1);f(len,len1); }}






原创粉丝点击