实验三 串的模式匹配
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/qdu/DS2020 |
|---|---|
| 这个作业的要求在哪里 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11165 |
| 这个作业的目标 | |
| 一、 实验目的 |
- 了解串的基本概念
- 掌握串的模式匹配算法的实现
二、 实验预习
说明以下概念
- 模式匹配:它是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。
链接:https://baike.baidu.com/item/ - BF算法:(即暴力(Brute Force)算法)它是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
链接:https://baike.so.com/doc/4931925-5152047.html - KMP算法:它是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
链接:https://baike.so.com/doc/5460302-5698691.html
注:1.每个链接有对应的概念介绍及扩展知识(分类、使用等);2.上述均不是超链接,仅仅是名称。
三、 实验内容和要求
1、阅读并运行下面程序,根据输入写出运行结果。
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100
typedef struct{
char data[MAXSIZE];
int length;
}SqString;
int strCompare(SqString *s1,SqString *s2); /*串的比较*/
void show_strCompare();
void strSub(SqString *s,int start,int sublen,SqString *sub);
/*求子串*/
void show_subString();
int strCompare(SqString *s1,SqString *s2){
int i;
for(i=0;i<s1->length&&i<s2->length;i++)
if(s1->data[i]!=s2->data[i])
return s1->data[i]-s2->data[i];
return s1->length-s2->length;
}
void show_strCompare(){
SqString s1,s2;
int k;
printf("\n***show Compare***\n");
printf("input string s1:");
gets(s1.data);
s1.length=strlen(s1.data);
printf("input string s2:");
gets(s2.data);
s2.length=strlen(s2.data);
if((k=strCompare(&s1,&s2))==0)
printf("s1=s2\n");
else if(k<0)
printf("s1<s2\n");
else
printf("s1>s2\n");
printf("\n***show over***\n");
}
void strSub(SqString *s,int start,int sublen,SqString *sub){
int i;
if(start<1||start>s->length||sublen>s->length-start+1){
sub->length=0;
}
for(i=0;i<sublen;i++)
sub->data[i]=s->data[start+i-1];
sub->length=sublen;
}
void show_subString(){
SqString s,sub;
int start,sublen,i;
printf("\n***show subString***\n");
printf("input string s:");
gets(s.data);
s.length=strlen(s.data);
printf("input start:");
scanf("%d",&start);
printf("input sublen:");
scanf("%d",&sublen);
strSub(&s,start,sublen,&sub);
if(sub.length==0)
printf("ERROR!\n");
else{
printf("subString is :");
for(i=0;i<sublen;i++)
printf("%c",sub.data[i]);
}
printf("\n***show over***\n");
}
int main(){
int n;
do {
printf("\n---String---\n");
printf("1. strCompare\n");
printf("2. subString\n");
printf("0. EXIT\n");
printf("\ninput choice:");
scanf("%d",&n);
getchar();
switch(n){
case 1:show_strCompare();break;
case 2:show_subString();break;
default:n=0;break;
}
}while(n);
return 0;
}
⦁ 运行程序
输入:
1
student
students
2
Computer Data Stuctures
10
4
运行结果:

- 实现串的模式匹配算法。补充下面程序,实现串的BF和KMP算法。
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100
typedef struct{
char data[MAXSIZE];
int length;
}SqString;
int index_bf(SqString *s,SqString *t,int start);
void getNext(SqString *t,int next[]);
int index_kmp(SqString *s,SqString *t,int start,int next[]);
void show_index();
int index_bf(SqString *s,SqString *t,int start);
void getNext(SqString *t,int next[]);
int index_kmp(SqString *s,SqString *t,int start,int next[]);
void show_index();
int index_bf(SqString *s,SqString *t,int start){
int i=start;
int j=0;
while(s->data[i]!='\0'&&t->data[j]!='\0'){
if(s->data[i]=t->data[j]){
i++;
j++;
}
else{
start++;
i=start;
j=0;
}
}
if(t->data[j]=='\0') return start+1;
else return 0;
}
void getNext(SqString *t,int next[]){
int i=0,j=-1;
next[0]=-1;
while(i<t->length){
if((j==-1)||(t->data[i]==t->data[j])){
i++;j++;next[i]=j;
}else
j=next[j];
}
}
int index_kmp(SqString *s,SqString *t,int start,int next[]){
const int len=t->length;
next[0]=-1;
int j=0;
int k=-1;
while (j<len-1){
if (k==-1 || t->data[j]==t->data[k])
{
j=j+1;
k=k+1;
next[j]=k; }
else
k=next[k];
}
SqString *vec;
int p=0;
int q=0;
while(p<s->length&&q<t->length){
if(q==-1||s->data[p]==t->data[q])
{
++p;
++q;
}
else
q=next[q];
if(q==t->length){
vec->data[p-q];
j=-1;
}
}
}
void show_index(){
SqString s,t;
int k,next[MAXSIZE]={0},i;
printf("\n***show index***\n");
printf("input string s:");
gets(s.data);
s.length=strlen(s.data);
printf("input string t:");
gets(t.data);
t.length=strlen(t.data);
printf("input start position:");
scanf("%d",&k);
printf("BF:\nthe result of BF is %d\n",index_bf(&s,&t,k));
getNext(&t,next);
printf("KMP:\n");
printf("next[]:");
for(i=0;i<t.length;i++)
printf("%3d",next[i]);
printf("\n");
printf("the result of KMP is %d\n",index_kmp(&s,&t,k,next));
printf("\n***show over***\n");
}
int main(){
show_index();
return 0;
}
⦁ 运行程序
输入:
abcaabbabcabaacbacba
abcabaa
1
运行结果:

四、 实验小结
本实验在原有的程序架构下,补充了BF算法和KMP算法的程序。根据题目要求,用C++运行程序,得到了较为合理的结果。本实验的重点在于BF算法和KMP算法的学习与运用,笔者利用课本及网络资源,对BF算法和KMP算法进行了初步的学习,对其有了整体上的了解后,进行BF算法和KMP算法的编程,从而圆满地完成了本实验。
五、 评语
Continue!

浙公网安备 33010602011771号