【数据结构】实验七:字符串

news2024/11/14 3:26:20

实验七 字符串实验报告

一、实验目的与要求

1)巩固对串的理解;

2)掌握串的基本操作实现;

3)掌握 BF 和 KMP 算法思想。

二、实验内容

1. 给定一个字符串ababcabcdabcde和一个子串abcd,查找字串是否在主串中出现。出现就返回主串中的第一个匹配下标,没有则返回-1。本题采用BF串匹配算法。

2.编写一个函数,计算一个子串在一个主串中出现的次数,如果该子串不出现,则返回0。本题考虑子串重叠,如:子串为aa,主串为aaa,考虑子串重叠结果为2,不考虑子串重叠结果为1。

示列1:输入:"ababab","abababab"    返回值:2

示列2:输入:"abab","abacabab"  返回值:1

提示:

首先进行特殊情况判断,如果模式串长度大于主串,或者主串为空,返回0。

然后分别遍历主串和模式串,只要当前字符相等,模式串和主串均后移一位,如果不相等,模式串重新回退到索引0的位置。

当模式串索引达到长度m时,说明全部匹配上了。此时将匹配次数加一,同时主串索引i回退到上次匹配开头的下一位,模式串索引j回到0。

采用kmp算法

三、实验结果

1)请将调试通过的运行结果截图粘贴在下面,并说明测试用例和运行过程,简述算法思想。

2)请将源代码cpp文件和实验报告一起压缩上传。


实验1


运行结果:

 

 

算法思想:

BF算法的思想主要如下:在主串和子串中设置比较的下标i和j(本段代码中初始化均为0)。循环比较直到主串中所剩字符个数小于子串的长度,或者是子串的所有字符均比较完。如果主串A和子串B满足A[i]=B[i],那么继续比较子串和主串的下一个字符;否则,将i和j回溯,准备下一趟的比较。如果子串中的所有字符均比较完,那么说明匹配成功,返回匹配的起始比较下标;否则,说明匹配失败,按照题目要求返回-1。

实验代码:

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;



//BF串匹配算法

int bf(char *strA, char *strB){

   //strA是主串,strB是子串

    int i=0,j=0;

    int lena=strlen(strA);//主串的长度

    int lenb=strlen(strB);//子串的长度

    while(i<lena && j<lenb){

        if(strA[i]==strB[j]){

            i++;

            j++;

        }

      else{

            i=i-j+1;//如果i、j初始值为1,则返回i=i-j+2?

            j=0;//重置子串的标记位置j

        }

    }//跳出循环,遍历完成

   

    //判断字串情况

    if(j==lenb){

        return i-j+1;//成功匹配

    }

    return -1;//不成功匹配

}



//主函数->调试

int main() {

    //int mybf=bf("ababcabcdabcde","abcd");

    char strA[1000],strB[1000];//max长度设置为1000

    cout<<"请输入主串:"<<endl;

   cin>>strA;

   cout<<"请输入子串:"<<endl;

   cin>>strB;

   int mybf=bf(strA,strB);

   if(mybf>0){

      cout<<"主串中的第一个匹配下标:"<<mybf<<endl;

   }

    else{

      cout<<mybf<<endl;

   }

    return 0;

}

 

实验2

运行结果:

 

 

算法思想:

KMP算法的思想主要如下:在主串A和子串B中设置比较的下标i和j(本段代码中初始化均为0)。循环比较直到主串中所剩字符个数小于子串的长度,或者是子串的所有字符均比较完。如果A[i]=B[j]或j=0,那么继续比较A和B的下一个字符;否则,将j向右滑动到next[i]的位置(j= next[i]),准备下一趟的比较。如果子串中的所有字符均比较完,那么说明匹配成功,返回匹配的起始比较下标;否则,说明匹配失败,按照题目的要求返回0。

实验代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int next[100];//全局数组变量 

//获取next数组 
void getNext(char b[],int next[]){
	int len=strlen(b);
	next[0]=-1;
	int k=-1;
	int j=0;
	while(j<len){
		if(k==-1 || b[k]==b[j]){
			j++;
			k++;
			next[j] = k;
		}
		else{
			k=next[k];
		}
	}
}

//KMP算法  
int kmp(char *a,char *b){
	int lena=strlen(a);
	int lenb=strlen(b);
	int i=0,n=0,k=0;//n作为计数器 
	while(i<lena){
		if(k==-1 || a[i]==b[k]){
			++i;
			++k;
		}
		else{
			k=next[k];
		}
		if(k==lenb){
			n++;
			k=next[k];
		}
	}
	return n;
}

int main(){
	char a[100000],b[10000];//a为主串,b为子串 
	cout<<"请输入主串:"<<endl; 
	cin>>a;
	cout<<"请输入子串:"<<endl; 
	cin>>b;
	getNext(b,next);
	cout<<"子串出现次数为:"<<kmp(a,b);
	return 0; 
}

其他:

#include<iostream>
using namespace std;

struct String{
	char *elem;
	int length;
};

void Strcpy(String &S,const char str[]){
	//忌引用数组 ,const!!!
	int i=0;
	int str_len=0;
	while(str[i]!='\0'){
		str_len++;
		i++;
	}//字符串长度 
	if(!str_len) 
	    S.length=0;
	int k=1,j=0;
	S.elem=new char[str_len+1];
	while(k<=str_len)
	S.elem[k++]=str[j++];
	S.elem[0]=' ';//0号位随意 
	S.length=str_len;
}

int StrIndex_BF(String &S,String &T,int pos){
	int i=pos,j=1;
	while((i<=S.length)&&(j<=T.length)){
		//while((i<=S.length-T.length+1)&&(j<=T.length))错误!! 
		if(S.elem[i]==T.elem[j]){
			i++;j++;
		}
		else{
			i=i-j+2;//回溯操作 
			j=1;
			if(i>S.length-T.length+1)
			break;//S中剩下元素小于T的元素个数 
		}
	}
	if(j>T.length)//T中全部字符均匹配成功! 
	return (i-T.length);
	else
	return -1;
}

void Destroy(String &S){
	delete []S.elem;
}

int main(){
	String S,T; 
//	Strcpy(S,"ababcabcdabcde");//主串 
//	Strcpy(T,"abcd");//模式串
	Strcpy(S,"ababcabcacbab");//主串 
	Strcpy(T,"abcac");//模式串 
	int p=StrIndex_BF(S,T,1);
	//匹配函数 
	if(p!=-1)
	cout<<"匹配成功!主串中的第一个匹配下标为:"<<p<<endl;
	else
	cout<<"匹配失败!"<<endl;
	Destroy(S);
	Destroy(T);
    return 0;
}
#include<iostream>
using namespace std;

struct String{
	char* elem;
	int length;
};

void StrCopy(String &s,char a[]){
	int i=0;
	int strlen=0;
	while(a[i]!='\0'){
		strlen++;
		i++;
	}
	s.elem=new char[strlen+1];
	int k=1,j=0;
	while(j<strlen)
	s.elem[k++]=a[j++];
	s.elem[0]='\0';
	s.length=strlen;
}

void Get_next(String &T,int (&next)[20]){
	int i=0,j=1;
	next[1]=0;
	while(j<T.length){
		if(i==0||T.elem[i]==T.elem[j]){
	    	i++;j++;next[j]=i;
     	}
    	else
        	i=next[i];
	}
}

int Strmatch_KMP(String &S,String &T,int next[]){
	int i=1,j=1,num=0;
	if(S.length<T.length)
	return 0;
	while((i<=S.length)&&(j<=T.length)){
		//while((i<=S.length-T.length+1)&&(j<=T.length))错误!! 
		if(j==0||(S.elem[i]==T.elem[j])){
			i++;j++;
		}
		else  j=next[j];
		if(j>T.length){
			num++;i=i-j+2;j=1;//回溯
			if(i>S.length-T.length+1)
			break;//S中剩下元素小于T的元素个数  
		}
	}
	return num;
}

void Destroy(String &S){
	delete []S.elem;
}

int main(){
	char a[20],b[20];
	gets(a);
	gets(b);
	String S,T;
	StrCopy(S,a);
	StrCopy(T,b);
	int next[20]={0,0,1};//初始化next【i】 
	Get_next(T,next);//找到对应的k值 
	int num=Strmatch_KMP(S,T,next);//重叠次数 
	if(!num) cout<<"子串不在主串中出现!"<<endl;
	else cout<<"子串在主串中出现,且重叠结果为:"<<num<<endl;
	Destroy(S);
	Destroy(T);
	return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible安装部署与应用

文章目录 一、ansible简介二、ansible 环境安装部署三、ansible 命令行模块3.1 command 模块3.2 shell 模块3.3 cron 模块3.4 user 模块3.5 group 模块3.6 copy 模块3.7 file 模块3.8 hostname 模块3.9 ping 模块3.10 yum 模块3.11 service/systemd 模块3.12 script 模块3.13 m…

可穿戴设备的发展

目录 1.什么是可穿戴设备 2.可穿戴设备的发展过程 3.可穿戴设备带来的福利 4.可穿戴设备未来的发展趋势 1.什么是可穿戴设备 可穿戴设备是指可以佩戴在身体上并与用户进行交互的电子设备。它们通常以小型、便携和智能化的形式呈现&#xff0c;与用户的服装、配饰或身体部位相…

nplayer读取电脑共享文件

Step 1&#xff1a; 在电脑中开启共享。 ▼想要访问电脑中的文件&#xff0c;电脑上需要有一个含密码的账户。 所以没有密码的首先得去控制面板为当前用户添加一个密码。 ▼下面添加共享文件夹。比如我们想共享music文件夹&#xff0c;则右键该文件夹>属性>共享>高级…

ChatGPT安卓版正式发布,附安装包,但有款手机无法使用

ChatGPT安卓版如约而至&#xff0c;OpenAI正式宣布该应用已在谷歌应用商店上架&#xff0c;用户可以免费下载&#xff0c;对话不限次数。 但是安卓版ChatGPT目前仅在美国、印度、孟加拉国和巴西提供下载&#xff0c;下周将会推广至更多国家。 网页端下载链接&#xff1a; http…

POM+数据驱动+pytest

POM数据驱动pytest 数据驱动&#xff1a;将测试过程中所有测试数据&#xff0c;进行提取、保存以及管理&#xff0c;提升框架的可维护性&#xff0c;一般情况下会使用到的数据类型&#xff1a;Excel、yaml、json、py......&#xff0c;如&#xff1a;登录场景&#xff0c;需要…

《长沙市“1+2+N”先进制造业集群提质升级研究》 课题调研组莅临麒麟信安展开专题调研

为提质升级长沙“12N”先进制造业产业集群&#xff0c;构建与现代产业体系相适应的产业生态&#xff0c;7月11日下午&#xff0c;由长沙市制造业发展促进中心党委书记沈群等市制造业发展促进中心相关领导以及中南大学王昶、卢锋华、朱思文等教授和多位博士、硕士组成的《长沙市…

视频剪辑矩阵分发系统Unable to load FFProbe报错技术处理?

问题一 报错处理 对于视频剪辑矩阵分发系统中出现的“Unable to load FFProbe”报错问题&#xff0c;可以采取以下技术处理措施进行解决。 1.检查系统中是否正确安装了FFProbe工具&#xff0c;并确保其路径正确配置。 2.检查系统环境变量是否正确设置&#xff0c;包括FFPr…

Rete算法相关内容与实例,搞懂Rete算法这一篇文章就够了,有我自己的理解,也有经典的例子详解,非常详细

Rete算法是一个规则匹配算法,是一个高效的规则匹配算法。Drools从3.X版本到7.X版本一直都是基于Rete算法实现规则匹配的,为了进一步了解Drools,所以就研究一下Rete算法。 Rete算法是由美国工程师Charles L. Forgy在1979年提出的。 该算法的设计的目的就是用于高效地处理规…

【设计模式——学习笔记】23种设计模式——装饰器模式Decorator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

生活案例 咖啡厅 咖啡定制案例 在咖啡厅中&#xff0c;有多种不同类型的咖啡&#xff0c;客户在预定了咖啡之后&#xff0c;还可以选择添加不同的调料来调整咖啡的口味&#xff0c;当客户点了咖啡添加了不同的调料&#xff0c;咖啡的价格需要做出相应的改变。 要求&#xff…

SAP安装笔记

1、准备安装介质&#xff0c;SWPM10SP25&#xff0c;51050829_NW750_JavaExport、SAP_HANA_CLIENT、kernel放到/sapcd/NetWeaver目录下 ​​​​​​​ 进入SWPM10SP25执行./sapinst安装 2、待出现 “Open your browser and paste the following URL address to access the G…

如何从0开始搭建公司自动化测试框架?25k入职新公司的我是这样做的..

搭建的自动化测试框架要包括API测试&#xff0c;UI测试&#xff0c;APP测试三类。以上三类其实可以简化为两类&#xff0c;那就是&#xff1a; 1&#xff09;接口自动化测试框架搭建 2&#xff09;UI自动化测试框架搭建。 没问题&#xff0c;安排&#xff0c;且是手把手教你如何…

高校宿舍报修管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的发展&#xff0c;信息化的管理手段早以在人们生活的各个方面取代了传统的管理手段&#xff0c;以先进管理理念为基础的现代化信息管理系统已经成为了许多机构的必备工具。在如今大学的校园里&#xff0c;有着许许多多的信息化管理系统&#xff0c;如图书管理系…

尚医通06:数据字典+EasyExcel+mongodb

内容介绍 1、数据字典列表前端 2、EasyExcel介绍、实例 3、数据字典导出接口、前端 4、数据字典导入接口、前端 5、数据字典添加redis缓存 6、MongoDB简介 7、MongoDB安装 8、MongoDB基本概念 数据字典列表前端 1、测试问题 &#xff08;1&#xff09;报错日志 &am…

LabVIEW开发小型减阻试验平台

LabVIEW开发小型减阻试验平台 湍流摩擦在粘性流体的阻力中起着重要作用&#xff0c;减少湍流摩擦是流体力学领域的热门话题之一。在油气管道的长距离流体输送中&#xff0c;泵站提供的几乎所有动力都用于克服流体的胫骨摩擦。在流体输送领域&#xff0c;船舶的蒙皮摩擦阻力占总…

函数详细解析

目录 形参有默认值的函数 基本概述 指令角度 设定形参默认值 内联函数 基本概述 代码段 函数重载 答疑解惑 形参有默认值的函数 基本概述 从右向左设定形参默认值 形参默认值可以在定义时设定&#xff0c;也可以在声明时设定 每个形参的默认值只能被设定一次 指令角度…

华为HCIP第二节-------------------------ISIS

IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNetwork Protocol&…

1200*B. Vanya and Lanterns

Examples input 7 15 15 5 3 7 9 14 0 output 2.5000000000 input 2 5 2 5 output 2.0000000000 解析&#xff1a; 最大距离即为每相邻两盏灯之间的最大距离/2 注意起点没有灯&#xff0c;终点可能有灯&#xff0c;需要分别判断 #include<bits/stdc.h> using nam…

前端html中让两个或者多个div在一行显示,用style给div加上css样式

文章目录 前言一、怎么让多个div在一行显示 前言 DIV是层叠样式表中的定位技术&#xff0c;全称DIVision&#xff0c;即为划分。有时可以称其为图层。DIV在编程中又叫做整除&#xff0c;即只得商的整数。 DIV元素是用来为HTML&#xff08;标准通用标记语言下的一个应用&#x…

如何在MacBook上彻底删除mysql

好久以前安装过&#xff0c;但是现在配置mysql一直出错&#xff0c;索性全部删掉重新配置。 一、停止MySQL服务 首先&#xff0c;请确保 MySQL 服务器已经停止运行&#xff0c;以免影响后续的删除操作。 sudo /usr/local/mysql/support-files/mysql.server stop如果你输入之…

DAY3,Qt(完成闹钟的实现,定时器事件处理函数的使用)

1.完成闹钟的实现&#xff0c;到点播报文本框的内容&#xff1b; ---alarm.h---头文件 #ifndef ALARM_H #define ALARM_H#include <QWidget> #include <QTimerEvent> //定时器处理函数类 #include <QTime> //时间类 #include <QPushButton> //按钮…