实验三 串的模式匹配
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三串的模式匹配
一、实验目的
1.利用顺序结构存储串,并实现串的匹配算法。
2.掌握简单模式匹配思想,熟悉KMP算法。
二、实验要求
1.认真理解简单模式匹配思想,高效实现简单模式匹配;
2.结合参考程序调试KMP算法,努力算法思想;
3.保存程序的运行结果,并结合程序进行分析。
三、实验内容
1、通过键盘初始化目标串和模式串,通过简单模式匹配算法实现串的模式匹配,匹配成功后要求输出模式串在目标串中的位置;
2、参考程序给出了两种不同形式的next数组的计算方法,请完善程序从键盘初始化一目标串并设计匹配算法完整调试KMP算法,并与简单模式匹配算法进行比较。
四、程序流程图、算法及运行结果
3-1
#include
#include
#define MAXSIZE 100
int StrIndex_BF(char s[MAXSIZE],char t[MAXSIZE])
{
int i=1,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 -1;
}
int main()
{
char s[MAXSIZE];
char t[MAXSIZE];
int answer, i;
printf("S String -->\n ");
gets(s);
printf("T String -->\n ");
gets(t);
printf("%d",StrIndex_BF(s,t)); /*验证*/
if((answer=StrIndex_BF(s,t))>=0)
{
printf("\n");
printf("%s\n", s);
for (i = 0; i < answer; i++)
printf(" ");
printf("%s", t);
printf("\n\nPattern Found at location:%d\n", answer); }
else
printf("\nPattern NOT FOUND.\n");
getch();
return 0;
}
3-2
#include
#include
#define MAXSIZE 100
void get_nextval(unsigned char pat[],int nextval[])
{
int length = strlen(pat);
int i=1;
int j=0;
nextval[1]=0;
while(i { if(j==0||pat[i-1]==pat[j-1]) { ++i; ++j; if(pat[i-1]!=pat[j-1]) nextval[i]=j; else nextval[i]=nextval[j]; } else j=nextval[j]; } } int Index_KMP(unsigned char text[], unsigned char pat[],int nextval[]) { int i=1; int j=1; int t_len = strlen(text); int p_len = strlen(pat); while(i<=t_len&&j<=p_len) { if(j==0||text[i-1]==pat[j-1]){++i;++j;} else j=nextval[j]; } if(j>p_len) return i-1-p_len; else return -1; } int main() { unsigned char text[MAXSIZE]; unsigned char pat[MAXSIZE]; int nextval[MAXSIZE]; int answer, i; printf("\nBoyer-Moore String Searching Program"); printf("\n===================================="); printf("\n\nText String --> "); gets(text); printf( "\nPattern String --> "); gets(pat); get_nextval(pat,nextval); if((answer=Index_KMP(text, pat,nextval))>=0) { printf("\n"); printf("%s\n", text); for (i = 0; i < answer; i++) printf(" "); printf("%s", pat); printf("\n\nPattern Found at location %d\n", answer); } else printf("\nPattern NOT FOUND.\n"); getch(); return 0; }