实验项目四 串基本操作的实现
课程名称:数据结构
实验项目名称:串基本操作的实现
实验目的:
1.掌握串的模式匹配操作。
实验要求:
1、 分别使用BF和KMP算法完成串的模式匹配。
实验过程:
BF算法代码;;
1、 设计完成next值的计算函数;
2、 设计完成修正next值的函数;
3、 KMP算法代码;
扫描二维码关注公众号,回复:
9166929 查看本文章
4、 输入子串(aaac)和主串(aaabaaaaaac)
5、 输出子串在主串中开始的位置及不同算法比较的次数。
此部分实验报告中给出BF,next,修正next,KMP的代码。
实验结果:
输入: 子串:aaac; 主串:aaabaaaaaac
输出:BF,KMP,改进的KMP三种算法分别比较的次数及查找到的子串在主串中的位置。
例:
BF比较??次 子串位置:8
KMP比较??次 子串位置:8
改进KMP比较??次 子串位置:8
实验分析:
1.普通next和修正next的区别;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为Stringindex.cpp。
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=100010;
typedef long long ll;
void Index_BF(string s,string t)//BF算法的实现
{
int i=0,j=0,cot=0;//两个指针
int x=s.length(),y=t.length();//求出两个串的长度
while(i<x&&j<y)
{
if(s[i]==t[j]) i++,j++;//只要相同两个指针就往后移动
else i=i-j+1,j=0;//如果不相同,i指针回到最初位置的下一位,j指针归零
cot++;//记录比较了多少次
}
if(j>=y) printf("BF一共比较%d次 子串在主串中的位置从: %d 开始\n",cot,i-y+1);
else printf("匹配失败\n");
}
void Index_KMP1(string s, string t, int next[])//kmp算法实现
{
int i=0,j=0,cot=0;//同上
int x=s.length(),y=t.length();//同上
while(i<x&&j<y)//两个串都未比较到串尾
{
if(s[i]==t[j]||j==-1) i++,j++;//继续比较后继字符
else j=next[j];//模式串向右移动
cot++;
}
if(j==y) printf("KMP一共比较%d次 子串在主串中的位置从: %d 开始\n",cot,i-y+1);
else printf("匹配失败\n");
}
void Index_KMP2(string s, string t, int next[])
{
int i=0,j=0,cot=0;
int x=s.length(),y=t.length();
while(i<x&&j<y)
{
if(s[i]==t[j]||j==-1) i++,j++;
else j=next[j];
cot++;
}
if(j==y) printf("改进的KMP一共比较%d次 子串在主串中的位置从: %d 开始\n",cot,i-y+1);
else printf("匹配失败\n");
}
void Get_next(string t, int next[])//记录模式串t中next的值并存入next数组中
{
int i=0,j=-1;
next[0]=-1;
int y=t.length();
while(i<y)
{
if(j==-1||t[i]==t[j]) i++,j++,next[i]=j;
else j=next[j];
}
}
void Get_nextval(string t, int nextval[])//记录模式串t中next的修正值并存入nextval数组中
{
int i=0,j=-1;
nextval[0]=-1;
int y=t.length();
while(i<y)
{
if(j==-1||t[i]==t[j])
{
++i,j++;
if(t[i]!=t[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
void menu()
{
int next[N],nextval[N];
string S,T;
cout <<"请输入主串"<<endl;
cin >>S;
cout <<"请输入字串"<<endl;
cin >>T;
Index_BF(S,T);
Get_next(T,next);
Index_KMP1(S,T,next);
Get_nextval(T,nextval);
Index_KMP2(S,T,nextval);
}
int main()
{
menu();
}