学习笔记------数据结构(C语言版) 串的模式匹配
2016-02-15 12:11
483 查看
//KMP.cpp
#include"predefined.h"
#include"SequenceString.h"
Status Index(SString S,SString T,int pos)
//算法4.5:T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
{
int i,j;
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int Index_KMP(SString S,SString T,int pos,int next[])
//算法4.6:利用模式串T的next函数求T在主串S中第pos个字符之后的位置的
//KMP算法。其中,T非空,1<=pos<=StrLength(S)
{
int i,j;
i=pos;
j=0;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
void get_next(SString T,int next[])
//算法4.7:求模式串的next函数值并存入数组next
{
int i,j;
next[1]=0;
i=1;
j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(SString T,int nextval[])
//算法4.8:求模式串T的next函数修正值并存入数组nextval
{
int i,j;
nextval[1]=0;
i=1;j=0;
while(i<T[0])
{
if(T[i]==T[j]||j==0)
{
i++;
j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
//main.cpp
#include"predefined.h"
#include"SequenceString.h"
void get_next(SString T,int next[]);
int Index_KMP(SString S,SString T,int pos,int next[]);
void get_nextval(SString T,int nextval[]);
int main()
{
int L,i1,i2,pos,i;
SString S,T;
char *s="abaaabcaabaabcacabaabcaabaabcac";
char *t="abaabcac";
StrAssign(S,s);
StrAssign(T,t);
L=StrLength(T);
int next[10];
int nextval[10];
get_next(T,next);
get_nextval(T,nextval);
pos=1;
i1=Index_KMP(S,T,pos,next);
i2=Index_KMP(S,T,pos,nextval);
printf("主 串:");
StrPrint(S);
printf("\n");
printf("模式串:");
StrPrint(T);
printf("\n\n");
printf("next :");
for(i=1;i<=L;i++)
printf("%d ",next[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i1);
printf("\n");
printf("nextval :");
for(i=1;i<=L;i++)
printf("%d ",nextval[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i2);
printf("\n");
return 0;
}
#include"predefined.h"
#include"SequenceString.h"
Status Index(SString S,SString T,int pos)
//算法4.5:T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
{
int i,j;
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int Index_KMP(SString S,SString T,int pos,int next[])
//算法4.6:利用模式串T的next函数求T在主串S中第pos个字符之后的位置的
//KMP算法。其中,T非空,1<=pos<=StrLength(S)
{
int i,j;
i=pos;
j=0;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
void get_next(SString T,int next[])
//算法4.7:求模式串的next函数值并存入数组next
{
int i,j;
next[1]=0;
i=1;
j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(SString T,int nextval[])
//算法4.8:求模式串T的next函数修正值并存入数组nextval
{
int i,j;
nextval[1]=0;
i=1;j=0;
while(i<T[0])
{
if(T[i]==T[j]||j==0)
{
i++;
j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
//main.cpp
#include"predefined.h"
#include"SequenceString.h"
void get_next(SString T,int next[]);
int Index_KMP(SString S,SString T,int pos,int next[]);
void get_nextval(SString T,int nextval[]);
int main()
{
int L,i1,i2,pos,i;
SString S,T;
char *s="abaaabcaabaabcacabaabcaabaabcac";
char *t="abaabcac";
StrAssign(S,s);
StrAssign(T,t);
L=StrLength(T);
int next[10];
int nextval[10];
get_next(T,next);
get_nextval(T,nextval);
pos=1;
i1=Index_KMP(S,T,pos,next);
i2=Index_KMP(S,T,pos,nextval);
printf("主 串:");
StrPrint(S);
printf("\n");
printf("模式串:");
StrPrint(T);
printf("\n\n");
printf("next :");
for(i=1;i<=L;i++)
printf("%d ",next[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i1);
printf("\n");
printf("nextval :");
for(i=1;i<=L;i++)
printf("%d ",nextval[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i2);
printf("\n");
return 0;
}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总