题目描述
学习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;
class MyString {
private:
string mainstr;
int size;
void GetNext(string p,int next[]) {
int i=0;
next[0]=-1;
int j=-1;
int len=p.length();
while(i<len) {
if(j==-1||p[i]==p[j]) {
++i;
++j;
next[i]=j;
} else
j=next[j];
}
}
int KMPFind(string p,int pos,int next[]) {
int i=pos;
int j=0;
int len=p.length();
while(i<size&&j<len)
{
if((j==-1)||mainstr[i]==p[j]) {
i++;
j++;
}
else {
j=next[j];
}
}
if(j==len) {
return i-len+1;
}
else return 0;
}
public:
MyString() {
size=0;
mainstr= "";
}
~MyString() {
size=0;
mainstr= "";
}
void SetVal(string sp);
int KMPFindSubstr(string p,int pos);
};
void MyString::SetVal(string sp) {
mainstr="";
mainstr.assign(sp);
size = mainstr.length();
}
int MyString::KMPFindSubstr(string p,int pos) {
int i;
int len =p.length();
int *next =new int [len+1];
GetNext(p,next);
for(int i=0; i<len; i++)
cout<<next[i]<<' ';
cout<<endl;
int v=-1;
v=KMPFind(p,pos,next);
delete []next;
return v;
}
int main() {
int t;
cin>>t;
while(t--) {
MyString A;
string sp,p;
cin>>sp>>p;
A.SetVal(sp);
cout<<A.KMPFindSubstr(p,0)<<endl;
}
return 0;
}