#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#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];
if(!H.ch) exit(OVERFLOW);
H.length=0;
return OK;
}
//01 创建串
Status CreateString (HString &H,int len)
{
char x;
for(int i=0;i<len;i++)
{
cin>>x;
H.ch[i]=x;
}
H.length=len;
return OK;
}
Status DisPlay(HString &H)
{
printf("打印串:") ;
for(int i=0;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=pos;
//int j=1; //初始化
int i=0,j=0;
while(i<S.length && j<T.length)//两个串均比较到末尾
{
if(S.ch[i]==T.ch[j])
{
++i;++j;//继续比较后继字符
}
else //指针退后重新开始比较
{
// i=i-(j-1)+1;
i=i-j+1;
j=0;
}
}
// if(j+1>T.length)
if(j>=T.length)
{
pos=i-T.length+1;
return i-T.length+1;//匹配成功
}
else return 0;//匹配失败
}
int Index_KMP(HString S,HString T,int &pos,int next[])
{
//int i=pos;
//int j=1; //初始化
int i=0;
int j=0;
while(i<S.length && j<T.length)//两个串均比较到末尾
{
if(j==-1||S.ch[i]==T.ch[j])
{
++i;++j;//继续比较后继字符
}
else
j=next[j]-1;
}
if(j>T.length)
{
return i-T.length+1;//匹配成功
pos=i-T.length+1;
}
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<T.length)
{
if(m==0||T.ch[m]==T.ch[j])
{
++m;++j;
next[j]=m;
}
else //匹配失败,则回溯
m=next[m];//若是字符不相同,则m回溯
}
}
void get_nextval(HString T,int nextval[])//求模式串T中的next函数修正值,并存入数组nextval
{
int i=0,j=0;
nextval[0]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;++j;
if(T.ch[i]!=T.ch[j])
nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int main()
{
int m,n,pos;
HString H,S,T;
int next[N];
int nextval[N];
//00 初始化
InitString(S);
InitString(T);
//01 创建串S
printf("创建的串长为:");
scanf("%d",&m);
printf("键入串S:");
CreateString(S,m);
DisPlay(S);
//01 创建串T
printf("创建的串长为:");
scanf("%d",&n);
printf("键入串T:") ;
CreateString(T,n);
DisPlay(T);
//02 实现BF模式匹配算法
Index_BF(S,T,pos);
printf("BF:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
//03 实现KMP模式匹配算法
get_next(T,next);
Index_KMP(S,T,pos,next);
printf("KMP:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
//04 实现KMP模式匹配 改进算法
get_nextval(T,nextval);
Index_KMP(S,T,pos,nextval);
printf("KMP(改进):模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
}
串(从0开始)(有bug)
最新推荐文章于 2024-08-30 23:28:54 发布