DS串应用--KMP算法
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS串应用--KMP算法相关的知识,希望对你有一定的参考价值。
题目描述
学习KMP算法,给出主串和模式串,求模式串在主串的位置
算法框架如下,仅供参考
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串
以此类推
输出
第一行输出第1个实例的模式串的next值
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0
以此类推
样例输入
3 qwertyuiop tyu aabbccdd ccc aaaabababac abac
样例输出
-1 0 0 5 -1 0 1 0 -1 0 0 1 8
提示
为什么next值和课本的不一样???
#include<iostream> #include<string> using namespace std; int *getnext(string p) { int j=0,k=-1; int *next=new int[p.size()]; next[0]=-1; while(j<(int)p.size()-1) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else k=next[k]; } return next; } int KMP(string s,string p) { int i=0,j=0; int *next=getnext(p); while(i<(int)s.size()&&j<(int)p.size()) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=next[j]; } if(j==(int)p.size()) return i-j+1; return 0; } int main() { int T; cin>>T; while(T--) { string s,p; cin>>s>>p; int *next=getnext(p); for(int i=0;i<(int)p.size();i++) { cout<<next[i]<<" "; } cout<<endl; cout<<KMP(s,p)<<endl; } return 0; }
以上是关于DS串应用--KMP算法的主要内容,如果未能解决你的问题,请参考以下文章