#include
#include
#include
#define MAXSIZE 100
using namespace std;
#define N 100
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct //串的堆式顺序存储结构
{
char *ch; //若是非空串,则按串长分配存储区,否则ch为NULL
int length; //串的当前长度
}HString;
//00 初始化
Status InitString(HString &H)
{
H.ch=new ElemType [MAXSIZE];
H.ch[0]='O';
if(!H.ch) exit(OVERFLOW);
H.length=0;
return OK;
}
//01 创建串
Status CreateString (HString &H,int len)
{
char x;
for(int i=1;i<=len;i++)
{
cin>>x;
H.ch[i]=x;
}
H.length=len;
return OK;
}
Status DisPlay(HString &H)
{
printf("打印串:") ;
for(int i=1;i<=H.length;i++)
{
printf("%c",H.ch[i]);
}
printf("n");
return OK;
}
//02 实现BF模式匹配算法
int Index_BF(HString S,HString T,int &pos)
{
int i=1,j=1,sum=0;
while(i<=S.length && j<=T.length)//两个串均比较到末尾
{
sum++;
if(S.ch[i]==T.ch[j])
{
++i;
++j;//继续比较后继字符
}
else //指针退后重新开始比较
{
i=i-(j-1)+1;
j=1;
}
}
cout<<"BF一共比较了"<T.length)
{
pos=i-T.length;
return i-T.length;//匹配成功
}
else return 0;//匹配失败
}
//03 实现KMP模式匹配算法
int Index_KMP(HString S,HString T,int &pos,int next[])
{
int i=1;
int j=1;
int sum=0;
while(i<=S.length && j<=T.length)//两个串均比较到末尾
{
sum++;
if(j==0||S.ch[i]==T.ch[j])
{
++i;++j;//继续比较后继字符
}
else
j=next[j];
}
cout<<"KMP一共比较了"<T.length)
{
pos=i-T.length;
return i-T.length;//匹配成功
}
else return 0;//匹配失败
}
void get_next(HString T,int next[])
{
next[1]=0;
int m,j;
m=0; //m=next[1],m代表的是前缀结束时的下标,也就是相似度,T1...Tm(m个字符)
j=1; //j代表的是后缀末尾的下标,Tj-m+1...Tj(m个字符) ++j后即所求next[j]
while(j