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
#include <iostream>
#include <string>
using namespace std;
class myString{
string S;
string T;
int *next;
void getNext();
public:
myString();
~myString();
int KMP();
void output();
};
myString::myString() {
cin>>S>>T;
next = new int[T.size()];
}
myString::~myString() {
delete []next;
}
int myString::KMP() {
int i,j;
for(i=0,j=0;i<S.size() && j<(int)T.size();)
{
if(j==-1 || S[i] == T[j])
i++,j++;
else
j = next[j];
}
if(j == T.size())
return i-j+1;
return 0;
}
void myString::getNext() {
int i,j;
i=0,j=-1;
next[i] = j;
while (i<T.size())
{
if(j==-1 || T[i] == T[j])
next[++i] = ++j;
else
j = next[j];
}
}
void myString::output() {
getNext();
for(int i=0;i<(int)T.size();i++)
cout<<next[i]<<' ';
cout<<endl;
cout<<KMP()<<endl;
}
int main()
{
int t;
cin>>t;
while (t--)
{
myString s;
s.output();
}
return 0;
}
来源:CSDN
作者:~澄~
链接:https://blog.csdn.net/luoyeliufeng/article/details/103586138