!顺序串的各种模式匹配运算
2013-01-27 15:20
274 查看
/*exp4-3.cpp*/
#include<stdio.h>
#include<string.h>
#define MaxSize 100
typedef struct
{
char ch[MaxSize];/*定义可容纳MaxSize个字符的空间*/
int len;/*标记当前实际串长*/
}SqString;
extern void StrAssign(SqString &str,char cstr[]);/*在algo4-1.cpp中*/
extern void DispStr(SqString s);
int Index(SqString s,SqString t)/*简单匹配算法*/
{
int i=0,j=0,k;
while(i<s.len && j<t.len)
{
if(s.ch[i]==t.ch[j])/*继续匹配下一个字符*/
{
i++;
j++;
}
else
{
i=i-j+1;/*主串、子串指针回溯重新开始下一次匹配*/
j=0;
}
}
if(j>=t.len)
k=i-t.len;/*返回匹配的第一个字符的下标*/
else
k=-1;/*模式匹配不成功*/
return k;
}
void GetNext(SqString t,int next[])/*由模式串t求出next值*/
{
int j,k;
j=0;k=-1;next[0]=-1;
while(j<t.len-1)
{
if(k==-1||t.ch[j]==t.ch[k])
{
j++;k++;
next[j]=k;
}
else k=next[k];
}
}
void GetNextval(SqString t,int nextval[])/*由模式串t求出nextval值*/
{
int j=0,k=-1;
nextval[0]=-1;
while(j<t.len)
{
if(k==-1 || t.ch[j]==t.ch[k])
{
j++;k++;
if(t.ch[j]!=t.ch[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
int KMPIndex(SqString s,SqString t)/*KMP算法*/
{
int next[MaxSize],i=0,j=0,v;
GetNext(t,next);
while(i<s.len && j<t.len)
{
if(j==-1 || s.ch[i]==t.ch[j])
{
i++;j++;
}/*i,j各增1*/
else
j=next[j];/*i不变,j后退*/
}
if(j>=t.len)
v=i-t.len;/*返回匹配模式串的首字符下标*/
else
v=-1;/*返回不匹配标志*/
return v;
}
int KMPIndex1(SqString s,SqString t)/*改进的KMP算法*/
{
int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
GetNextval(t,next);
GetNextval(t,nextval);
while(i<s.len && j<t.len)
{
if(j==-1 || s.ch[i]==t.ch[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if(j>=t.len)
v=i-t.len;/*返回匹配模式串的首字符下标*/
else
v=-1;
return v;
}
void main()
{
int j;
int next[MaxSize],nextval[MaxSize];
SqString s,t;
StrAssign(s,"abcabcdabcdabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
printf("串s:");DispStr(s);
printf("串t:");DispStr(t);
printf("t在s中的位置=%d\n",Index(s,t));
GetNext(t,next);/*由模式串t求出next值*/
GetNextval(t,nextval);/*由模式串t求出nextval值*/
printf(" j ");
for(j=0;j<t.len;j++)
printf("%4d",j);
printf("\n");
printf("t[j]");
for(j=0;j<t.len;j++)
printf("%4c",t.ch[j]);
printf("\n");
printf("next");
for(j=0;j<t.len;j++)
printf("%4d",next[j]);
printf("\n");
printf("nextval");
for(j=0;j<t.len;j++)
printf("%4d",nextval[j]);
printf("\n");
printf("KMP算法:\n");
printf("t在s中的位置=%d\n",KMPIndex(s,t));
printf("改进的KMP算法:\n");
printf("t在s中的位置=%d\n",KMPIndex1(s,t));
}
#include<stdio.h>
#include<string.h>
#define MaxSize 100
typedef struct
{
char ch[MaxSize];/*定义可容纳MaxSize个字符的空间*/
int len;/*标记当前实际串长*/
}SqString;
extern void StrAssign(SqString &str,char cstr[]);/*在algo4-1.cpp中*/
extern void DispStr(SqString s);
int Index(SqString s,SqString t)/*简单匹配算法*/
{
int i=0,j=0,k;
while(i<s.len && j<t.len)
{
if(s.ch[i]==t.ch[j])/*继续匹配下一个字符*/
{
i++;
j++;
}
else
{
i=i-j+1;/*主串、子串指针回溯重新开始下一次匹配*/
j=0;
}
}
if(j>=t.len)
k=i-t.len;/*返回匹配的第一个字符的下标*/
else
k=-1;/*模式匹配不成功*/
return k;
}
void GetNext(SqString t,int next[])/*由模式串t求出next值*/
{
int j,k;
j=0;k=-1;next[0]=-1;
while(j<t.len-1)
{
if(k==-1||t.ch[j]==t.ch[k])
{
j++;k++;
next[j]=k;
}
else k=next[k];
}
}
void GetNextval(SqString t,int nextval[])/*由模式串t求出nextval值*/
{
int j=0,k=-1;
nextval[0]=-1;
while(j<t.len)
{
if(k==-1 || t.ch[j]==t.ch[k])
{
j++;k++;
if(t.ch[j]!=t.ch[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
int KMPIndex(SqString s,SqString t)/*KMP算法*/
{
int next[MaxSize],i=0,j=0,v;
GetNext(t,next);
while(i<s.len && j<t.len)
{
if(j==-1 || s.ch[i]==t.ch[j])
{
i++;j++;
}/*i,j各增1*/
else
j=next[j];/*i不变,j后退*/
}
if(j>=t.len)
v=i-t.len;/*返回匹配模式串的首字符下标*/
else
v=-1;/*返回不匹配标志*/
return v;
}
int KMPIndex1(SqString s,SqString t)/*改进的KMP算法*/
{
int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
GetNextval(t,next);
GetNextval(t,nextval);
while(i<s.len && j<t.len)
{
if(j==-1 || s.ch[i]==t.ch[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if(j>=t.len)
v=i-t.len;/*返回匹配模式串的首字符下标*/
else
v=-1;
return v;
}
void main()
{
int j;
int next[MaxSize],nextval[MaxSize];
SqString s,t;
StrAssign(s,"abcabcdabcdabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
printf("串s:");DispStr(s);
printf("串t:");DispStr(t);
printf("t在s中的位置=%d\n",Index(s,t));
GetNext(t,next);/*由模式串t求出next值*/
GetNextval(t,nextval);/*由模式串t求出nextval值*/
printf(" j ");
for(j=0;j<t.len;j++)
printf("%4d",j);
printf("\n");
printf("t[j]");
for(j=0;j<t.len;j++)
printf("%4c",t.ch[j]);
printf("\n");
printf("next");
for(j=0;j<t.len;j++)
printf("%4d",next[j]);
printf("\n");
printf("nextval");
for(j=0;j<t.len;j++)
printf("%4d",nextval[j]);
printf("\n");
printf("KMP算法:\n");
printf("t在s中的位置=%d\n",KMPIndex(s,t));
printf("改进的KMP算法:\n");
printf("t在s中的位置=%d\n",KMPIndex1(s,t));
}
相关文章推荐
- 数据结构第四次上机 第四章之BF和KMP算法(顺序串的各种模式匹配算法)
- 顺序串各种基本运算的算法
- sql server模式匹配运算下的转义符
- 顺序环形队列的各种基本运算
- 3.1实现顺序栈的各种基本运算
- 关于字符串匹配(单模式匹配)的各种算法
- 实现顺序队列各种基本运算的算法
- 朴素模式的匹配算法-顺序
- 实现顺序队列各种基本运算的算法
- 实现顺序表的各种基本运算
- 第八周 数据结构之自建算法库——顺序串【项目5 - 计数的模式匹配】
- 实现顺序串各种基本运算的算法
- nginx的location匹配模式及顺序
- 3.3实现顺序队的各种运算
- 顺序表的各种基本运算
- 实现顺序表各种基本运算算法
- 实现环形队列各种基本运算的算法(用顺序结构)
- 顺序串的模式匹配 朴素算法
- 顺序环形队列的各种基本运算
- [各种面试题] 匹配的字符串模式的个数