一、题目描述
学习KMP算法,给出主串和模式串,求模式串在主串的位置
算法框架如下,仅供参考
#include<iostream>
#include<string>
using namespace std;
class myString
{
private:
string mainstr; // 串
int size; // 串长度
void GetNext(string p, int next[]);
int KMPFind(string p, int pos, int next[]);
public:
myString();
~myString();
void SetVal(string sp);
int KMPFindSubstr(string p, int pos);
};
myString::myString()
{
size = 0;
mainstr = "";
}
myString::~myString()
{
size = 0;
mainstr = "";
}
void myString::SetVal(string sp)
{
mainstr = "";
mainstr.assign(sp);
size = mainstr.length();
}
int myString::KMPFindSubstr(string p, int pos)
{
int i;
int L = p.length();
int *next = new int[L];
GetNext(p, next);
for(i = 0; i < L; i ++)
cout << next[i] << ' ';
cout << endl;
int v = -1;
v = KMPFind(p, pos, next);
delete []next;
return v;
}
二、输入与输出
1.输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串
以此类推
3
qwertyuiop
tyu
aabbccdd
ccc
aaaabababac
abac
2.输出
第一行输出第1个实例的模式串的next值
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0
以此类推
-1 0 0
5
-1 0 1
0
-1 0 0 1
8
三、参考代码
#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;
}
/**********************************************************************
Problem: 1071
Language: C++
Result: AC
Time:10 ms
Memory:2224 kb
**********************************************************************/