【数据结构】实验七:字符串
实验七 字符串实验报告
一、实验目的与要求
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长度设置为1000cout<<"请输入主串:"<<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);elsereturn -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;elsecout<<"匹配失败!"<<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;}elsei=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;
}
相关文章:
【数据结构】实验七:字符串
实验七 字符串实验报告 一、实验目的与要求 1)巩固对串的理解; 2)掌握串的基本操作实现; 3)掌握 BF 和 KMP 算法思想。 二、实验内容 1. 给定一个字符串ababcabcdabcde和一个子串abcd,查找字串是否在主串中出现。…...
排序算法、
描述 由小到大输出成一行,每个数字后面跟一个空格。 输入 三个整数 输出 输入三个整数,按由小到大的顺序输出。 输入样例 1 2 3 1 输出样例 1 1 2 3 输入样例 2 4 5 2 输出样例 2 2 4 5 代码一(如下)࿱…...
rbd快照管理、rbd快照克隆原理与实现、rbd镜像开机自动挂载、ceph文件系统、对象存储、配置对象存储客户端、访问Dashboard
day04 day04快照快照克隆开机自动挂载ceph文件系统使用MDS对象存储配置服务器端配置客户端访问Dashborad 快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态,可以恢复快照使用镜像、快照综合示例 # 1. 在rbd存…...
vue、vuex、vue-router初学导航配合elementui及vscode快捷键
目录 一、vue资源 1.vue知识库汇总 2.vuejs组件 3.Vue.js 组件编码规范 目标 #目录 #基于模块开发...
Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR
问题陈述 在信息过载的时代,根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文,从而导致相关性较低的结果。 解决方案:ELSER Elastic 通过其检索模型…...
MySQL数据库分库分表备份(shell脚本)
创建目录 mkdir /server/scripts 一、使用脚本实现分库备份 1、创建脚本并编写 [rootlocalhost scripts]# vim bak_db_v1.sh #!/bin/bash ######################################### # File Name:bak_db_v1.sh # Version: V1.0 # Author:Shen QL # Email:17702390000163.co…...
建造者设计模式go实现尝试
文章目录 前言代码结果总结 前言 本文章尝试使用go实现“建造者”。 代码 package mainimport ("fmt" )// 产品1。可以有不同的毫无相关的产品,这里只举一个 type Product1 struct {parts []string }// 产品1逻辑。打印组成产品的部分 func (p *Product…...
创建交互式用户体验:探索JavaScript中的Prompt功能
使用JavaScript中的Prompt功能:创建交互式用户体验 在前端开发中,JavaScript的prompt()函数是一个强大而有用的工具,它可以创建交互式的用户体验。无论是接收用户输入、进行简单的验证还是实现高级的交互功能,prompt()函数都能胜…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:基础知识]
分类目录:《自然语言处理从入门到应用》总目录 语言模型以文本作为输入,这段文本通常被称为提示(Prompt)。通常情况下,这不仅仅是一个硬编码的字符串,而是模板、示例和用户输入的组合。LangChain提供了多个…...
OpenPCDet调试出现的问题
Open3d遇到的问题,解决方案 1.ModuleNotFoundError: No module named ‘pcdet’ 原因:没有编译安装pcdet。 解决:进入openpcdet项目根目录,修改setup.py权限,并编译: sudo chmod 777 setup.py python set…...
【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】
4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…...
VBA技术资料MF34:检查Excel自动筛选是否打开
【分享成果,随喜正能量】聪明人,抬人不抬杠;傻子,抬杠不抬人。聪明人,把别人抬得很高,别人高兴、舒服了,看你顺眼了,自然就愿意帮你!而傻人呢?不分青红皂白&a…...
spring扩展点
在Spring框架中,有多个扩展点(Extension Point)可用于自定义和扩展应用程序的行为。这些扩展点允许开发人员介入Spring的生命周期和行为,并提供了灵活性和可定制性。以下是一些常见的Spring扩展点: BeanPostProcessor&…...
Skin Shader 使用自动生成的Thickness
Unity2023.2的版本,Thickness 自动化生成,今天测试了一把,确实不错。 1.Render 设置 在Project Settings->Graphics->HDRP Global Settings中 Frame Setting->Rendering->Compute Thickness 打开 2.Layer设置 2.1添加Layer&…...
Docker中的网络
文章目录 网络网桥(bridge)创建网桥接口hostnonecontaineroverlayoverlay底层原理 网络 网桥(bridge) 在Docker中,网桥(Bridge)是一种网络驱动,用于实现Docker容器之间和容器与宿主…...
SRS开源代码框架,协程库state-threads的使用
本章内容解读SRS开源代码框架,无二次开发,以学习交流为目的。 SRS是国人开发的流媒体服务器,C语言开发,本章使用版本:https://github.com/ossrs/srs/tree/5.0release。 目录 SRS协程库ST的使用源码ST协程库测试SrsAut…...
【QT 网络云盘客户端】——登录界面功能的实现
目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面,将数据 输入 到 用户名,昵称,密码,确认密码,手机,邮箱 的输入框中, 点…...
【复盘与分享】第十一届泰迪杯B题:产品订单的数据分析与需求预测
文章目录 题目第一问第二问2.1 数据预处理2.2 数据集分析2.2.1 训练集2.2.2 预测集 2.3 特征工程2.4 模型建立2.4.1 模型框架和评价指标2.4.2 模型建立2.4.3 误差分析和特征筛选2.4.4 新品模型 2.5 模型融合2.6 预测方法2.7 总结 结尾 距离比赛结束已经过去两个多月了。 整个过…...
X - Transformer
回顾 Transformer 的发展 Transformer 最初是作为机器翻译的序列到序列模型提出的,而后来的研究表明,基于 Transformer 的预训练模型(PTM) 在各项任务中都有最优的表现。因此,Transformer 已成为 NLP 领域的首选架构&…...
ubuntu下畅玩Seer(via wine)
第一步:安装wine 部分exe文件的运行需要32位的指令集架构,需要向Ubuntu系统中添加一个新的架构(i386),以支持32位的软件包。因为在64位的Ubuntu系统中,默认情况下只能安装和运行64位的软件。 通过添加i386…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
