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); }}
阅读全文
0 0
- KMP-类型总结
- kmp总结
- KMP总结
- kmp总结
- KMP总结
- KMP总结
- KMP总结
- KMP总结
- KMP (KMP+拓展KMP)算法总结
- KMP算法总结
- kmp算法总结
- Poj KMP 总结
- KMP算法总结
- KMP算法总结
- [暂定]KMP总结
- KMP算法学习总结
- KMP算法大总结
- kmp算法总结
- [自然语言处理] (6) 主题提取 + 文本实体标注
- java AWT 剪贴板Clipboard
- WebApi 自带Json返回日期带T无法格式化的问题
- 动态库与静态库
- tomcat配置热部署(maven插件配合热部署)
- KMP-类型总结
- [BZOJ4195][NOI2015]程序自动分析(离散化+并查集)
- 【输出两个数之间所有素数】小技巧
- Java_final修饰符总结
- 洛谷10月月赛R1·浴谷八连测R1·提高组
- Python学习笔记(3)--数据文件的读写
- mysql导入导出sql文件
- spring cloud学习(六) 配置中心-自动更新
- 【TEST】美团 CodeM 初赛 Round 1 || 2