数据结构作业:实验项目四 串基本操作的实现

实验项目四 串基本操作的实现

课程名称:数据结构

实验项目名称:串基本操作的实现

实验目的:

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();
}
发布了197 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/103327071