实验题3:实现顺序串的各种模式匹配算法
目的:掌握串的模式匹配算法(BF和KMP算法)设计。
内容:编写一个程序exp4-3.cpp,实现顺序串的各种模式匹配算法,并在此基础上完成以下功能。
(1)建立目标串s="abcabcdabcdeabcdefabcdefg"和模式串t="abcdeabcdefab"。
(2)采用简单匹配算法求t在s中的位置。
(3)由模式串t求出next数组值和nextval数组值。
(4)采用KMP算法求t在s中的位置。
(5)采用改进的KMP算法求t在s中的位置。
c++代码:
BF算法:
#include
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct
{
char data[MaxSize];
int length;
}SqString;
//生成串
void StrAssign(SqString &s,char cstr[])
{
int i;
for (i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
//销毁串
void DestroyStr(SqString &s)
{
}
//串的复制
void StrCopy(SqString &s,SqString t)
{
int i;
for (i=0;i
s.length=t.length;
}
//BF算法
int BF(SqString s,SqString t)
{
int i=0,j=0;
while (i
if(s.data[i]==t.data[j])
{
i++;j++;
}
else
{
i=i-j+1;j=0;
}
}
if(j>=t.length)
return(i-t.length);
else
return(-1);
}
//求next数组
void GetNext(SqString t,int next[])
{
int j,k;
j=0;k=-1;
next[0]=-1;
while(j
if(k==-1||t.data[j]==t.data[k])
{
j++;k++;
next[j]=k;
}
else k=next[k];
}
}
void GetNextval(SqString t,int nextval[])
{
int j=0,k=-1;
nextval[0]=-1;
while(j
if(k==-1 || t.data[j]==t.data[k])
{
j++;k++;
if (t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
//主程序
int main()
{
int i;
int next[MaxSize],nextval[MaxSize];
SqString s,t;
StrAssign(s,"abcabcdabcdeabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
cout<<"abcabcdabcdeabcdefabcdefg"<
GetNextval(t,nextval);
//输出字符位置
cout<<" j ";
for (i=0;i
cout< }
cout<
cout<<" t ";
for (i=0;i
cout<
cout<
//输出next[j]
cout<<"next[j] ";
for (i=0;i
cout<
cout<
}
KMP算法及KMP修正算法:
#include
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct
{
char data[MaxSize];
int length;
}SqString;
//生成串
void StrAssign(SqString &s,char cstr[])
{
int i;
for (i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
//销毁串
void DestroyStr(SqString &s)
{
}
//串的复制
void StrCopy(SqString &s,SqString t)
{
int i;
for (i=0;i
s.length=t.length;
}
//求next数组
void GetNext(SqString t,int next[])
{
int j,k;
j=0;k=-1;
next[0]=-1;
while(j
if(k==-1||t.data[j]==t.data[k])
{
j++;k++;
next[j]=k;
}
else k=next[k];
}
}
//KMP算法
int KMPIndex(SqString s,SqString t)
{
int next[MaxSize],i=0,j=0;
GetNext(t,next);
while(i
if(j==-1 ||s.data[i]==t.data[j])
{
i++;
j++;
}
else j=next[j];
}
if(j>=t.length)
return(i-t.length);
else
return(-1);
}
//修正KMP
void GetNextval(SqString t,int nextval[])
{
int j=0,k=-1;
nextval[0]=-1;
while(j
if(k==-1 || t.data[j]==t.data[k])
{
j++;k++;
if (t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
int KMPIndexl(SqString s,SqString t)
{
int nextval[MaxSize],i=0,j=0;
GetNextval(t,nextval);
while (i
if(j==-1 || s.data[i]==t.data[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if (j>=t.length)
return(i-t.length);
else
return(-1);
}
//主函数
int main()
{
int i;
int next[MaxSize],nextval[MaxSize];
SqString s,t;
StrAssign(s,"abcabcdabcdeabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
cout<<"s=abcabcdabcdeabcdefabcdefg"<
GetNextval(t,nextval);
//输出字符位置
cout<<" j ";
for (i=0;i
cout< }
cout<
cout<<" t ";
for (i=0;i
cout<
cout<
GetNextval(t,nextval);
//输出next[j]
cout<<"next[j] ";
for (i=0;i
cout<
cout<
cout<<"nextval[j] ";
for (i=0;i
cout<
cout<<"t在s中的位置=\n"<
}