- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构--串的应用,模式匹配算法附源程序(转).doc
这一篇写的模式匹配算法是以上一篇串的基本操作为基础的,这里面写了模式匹配的三种不同的算法,其实每个算法都是前一算法的改进,有简单匹配,头尾匹配,还有改进后KMP算法这是文件fun.h:
#ifndef FUN_H
#define FUN_H
#include mystring.h
int Index(String *sub,String *s,int pos); //匹配的简单算法:返回子串sub在主串s中的位置,失败则返回0
int Index_HeadToTail(String *sub,String *s,int pos);//匹配的改进算法:头尾同时进行比较
void get_next(String *,int []);? ? //KMP算法中的next函数算法
int kmp(String *s,String *T,int [],int pos); //KMP的改进算法
int Index(String *sub,String *s,int pos)
{
int i,j;
if(pos0||poss-length)??exit(OVERFLOW);
i=pos-1;
j=0;
while(is-length jsub-length)
{
??if(s-ch[i]==sub-ch[j])
??{
? ?++i;++j;
??}
??else
??{
? ?i=i-j+2;
? ?j=0;
??}
? ? }
if(j==sub-length)??
{
??printf(Success!);
??TURNLINE;
??return i-sub-length;//匹配成功,并且此时i,j的位置都在\0上,则返回在主串中匹配的第一个位置
}
else
{
??printf(Failed!);
??TURNLINE;
??return 0;
}
}
int Index_HeadToTail(String *sub,String *s,int pos)
{
int i,j=1,k=1;
i=pos-1;
while(is-length)
{
??if(s-ch[i]!=sub-ch[0]) ++i;??//如果头字符匹配不成功则继续匹配下一个
??else if (s-ch[i+sub-length-1]!=sub-ch[sub-length-1])??++i; //如果头字符匹配成功,但尾字符匹配不成功,继续匹配下一个
??else
??{??
? ???while(jsub-length s-ch[i+k]==sub-ch[j])
? ???{
? ?? ?++k;++j;
? ???}
? ???if(j==sub-length)??
? ???{
? ?? ?printf(Success!);
? ?? ?TURNLINE;
? ?? ?return i;
? ???}
? ???else
? ???{
? ?? ?printf(Failed);
? ?? ?TURNLINE;
? ?? ?return 0;
? ???}
??}
}
return 0;
}
void get_next(String *s,int next[])
{
int i,j;
? ? next[0]=-1;
i=0;
j=-1;
while(is-length)
{
??if(j==-1||s-ch[i]==s-ch[j])
??{
? ?++i;
? ?++j;
? ?if(s-ch[i]!=s-ch[j])??next[i]=j;
? ?else next[i]=next[j];
??}
??else j=next[j];
}
}
int kmp(String *s,String *T,int next[],int pos)
{
int i,j;
? ?
if(pos1||poss-length)
? ?? ?? ? exit(OVERFLOW);
i=pos-1;
j=0;
while(is-length jT-length)
{
??if(s-ch[i]==T-ch[j] || j==-1)
??{
? ?++i;
? ?++j;
??}
??else j=next[j];
}
if(j==T-length)
{
??printf(Success!);
??TURNLINE;
??return? ?i-T-length;
}
else
{
??printf(Failed!);
??TURNLINE;
??return 0;
}
}
#endif
复制代码
这是mian函数:
#include mystring.h
#include fun.h
int main()
{
String str1,str2,str3;
i
文档评论(0)