数据结构 第四章 串

news2025/1/12 17:45:19

她:点击收听

1 基本知识点

1、串中的元素是字符
2、操作的对象往往不再是单个数据元素,而是一组数据元素(子串)
3、串:由零个或多个字符组成的有限序列
4、子串:串中任意连续个字符组成的子序列
5、包含子串的串又被称为该子串的主串
6、真子串是指非空并且不为自身的子串
7、子串定位:子串在主串中的位置(在主串中查找子串第一次出现的位置)(也可以称为模式匹配或者模型匹配)
8、空串是不含有任何字符的串
9、组成串的数据元素只可以为字符
10、主串长度为n,子串长度为m,那么KMP算法的时间复杂度为O(m+n)
11、KMP算法的特点是:在模式匹配的时候指向主串的指针不会变小(只会不动或者向后移动)


2 串的模式匹配

子串的定位操作称为模式匹配

在主串中查找子串第一次出现的位置

如果匹配成功,那么返回子串在主串中第一次出现的位置;如果匹配失败,那么返回-1
请添加图片描述
请添加图片描述

请添加图片描述

int i = 0;
int j = 0;
//i为主串指针 j为子串指针
if(S.curlength<T.curlength)
	return -1;
//S为主串 T为子串
//主串长度小于子串 匹配失败
while(i<S.curlength&&j<T.curlength){
	if(S.data[i] == T.data[j]){
		i++;
		j++;
		//对应字符相等就让指针向后移动
	}else{
		//对应字符不相等就让:
		//主串指针回溯(由原来位置移动到下一个位置开始比较)
		//子串从头开始
		i = i-j+1;
		j = 0;
	}
}
if(j>=T.curlength)
	return (i-T.curlength);
//匹配成功返回子串在主串中的位置
else	
	return -1;	

总结:
请添加图片描述


3 KMP算法

主串不需要回溯,主串指针一直向后移动,只有子串指针回溯

请添加图片描述
当Si和Tj匹配失败的时候:

1 在子串中找到A和B两段是相等的
2 那么在主串中也对应C和D两段是相等的
3 所以说A和D两段是相等的

请添加图片描述
那么就可以从Tk开始和Si继续比较
(将子串的指针从j退回到k,主串的指针保留在i)

找到Tk的位置是关键
请添加图片描述
由图可得:在i = j = 9时匹配失败
需要将j回退到k = 3处,保持i不变
同时,将③称为首串,将④称为尾串

1 首串:是以子串的第一个字符开始
2 尾串:是以匹配失败位置的前一个字符结束

(所以说②和③一定相等)

找到首串和尾串是关键
(首串和尾串的长度应该小于原字符串的长度)
请添加图片描述

整型数组next:

在j位置匹配失败:回溯到k
next[j] = k

请添加图片描述
求解next数组:

next数组的前两个元素值一般是-1和0

请添加图片描述

请添加图片描述

分析:
1 走到a的时候,a的前面不存在首串和尾串,所以说a时赋值还是为0
2 走到b的时候,b的前面存在“a”为首串和尾串,长度为1,所以说b时赋值为1
3 走到c的时候,c的前面存在“ab”为首串和尾串,长度为2,所以说c时赋值为2
4 走到d的时候,d的前面存在“abc”为首串和尾串,长度为3,所以说d时赋值为3

请添加图片描述
由此可得:
请添加图片描述

解释:
1 当i和j走到9的时候,匹配失败
2 查看j为9时对应的next数组的值为3
3 将子串回溯到j=3继续开始比较
4 最后可以发现匹配成功

4 改进的KMP算法

请添加图片描述
请添加图片描述
那么nextVal数组的值是怎么求得的呢?

求解nextVal数组的值:
请添加图片描述

1 已知next数组
2 再去求解nextVal数组
3 第一个元素值为-1
4 剩下的元素的值需要找到next数组值对应元素相比较
5 如果元素相同,就用前面的值去替换后面的值
6 不相等就继续保留
7 nextVal数组完成

过程:
请添加图片描述

遇到nextVal为-1失配情况时,i++,j=0

5 题目解析

请添加图片描述

解析:
1 长度为1的字符串有n个
2 n、n-1...2
3 那么求和可知:((n+2)*(n-1))/2
4 等价于D选项

请添加图片描述

解析:
1 使用KMP的next数组方法
2 对于模式串t而言,next数组值为:
a b a a b c
-1 0 0 1 1 2
3 当i等于j等于5时候失配,那么j将回溯到2,i不发生改变

已知模式串(子串),求对应的next数组的值
请添加图片描述

解析:
1 第一个元素为-1
2 第二个元素为0
3 注意找首串和尾串

请添加图片描述

注意:j为7时对应为4

请添加图片描述

请添加图片描述

解析:
1 求next数组值
2 求nextVal数组值

6 算法设计题

判断给定的串是否为回文串

例如:noon、level都是回文串
//代码实现
int main(){
	string arr;
	int i,j,k=0;
	getline(cin,arr);
	for(i=0,j=arr.length()-1;i<j;i++,j--){
		if(arr[i]!=arr[j])
			break;
	}
	if(i>=j)
		cout<<"Yes"<<endl;
	else
		cout<<"No"<<endl;
	return 0;
}

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

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

相关文章

LeetCode[685]冗余连接II

难度&#xff1a;困难题目&#xff1a;在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。输入一个有向图&#xf…

Linux 笔记3

5.Linux 的网络信息5.1主机名称5.1.1临时修改&#xff1a;hostname 新名字 &#xff08;需要重新进入才能显示新名字&#xff09;reboot重启虚拟机5.1.2永久&#xff1a;vi /etc/hostname5.2DNS解析dns解析域名域名-》ipdns域名劫持&#xff1a;将域名对应的ip改掉5.2.1修改主机…

networkx学习(四)无标度网络

networkx学习(四)无标度网络 无标度网络: 对于随机网络和规则网络,度分布区间非常狭窄,大多数节点都集中在节点度均值< k >的附近,说明节点具有同质性,因此< k >可以被看作是节点度的一个特征标度。而在节点度服从幂律分布的网络中,大多数节点的度都很小,…

从零创建vue示例

从零创建vue搭建node环境创建vue项目vue项目目录介绍搭建node环境 1.下载node(node官网) 安装node一路点next即可 2.windowR—cmd ----测试一下npm -v 以及node -v 显示版本号 3.执行以下命令&#xff08;-g表示全局安装&#xff09; npm install -g vue npm install -g vue…

优化命令 nload详解

优化命令 nload详解 引言 nload用于实时监控linux下网络流量信息&#xff0c;是命令行工具&#xff0c;用来监控网络的吞吐量。它使用两个图表数据来对进出站流量进行可视化。 一、nload安装 nload工具并不是centos自带的&#xff0c;需要我们手动安装下载 直接yum安装查不到…

Kettle 快捷引入数据库

在编写kettle任务时往往需要连接数据库&#xff0c;kettle一共提供了四种数据库配置方式&#xff0c;JDBC、ODBC、OCI、JNDI&#xff0c;我最初直接使用的最为熟悉的JDBC&#xff0c;但是多写几个转换程序就会发现&#xff0c;每新建一个转换任务文件时都需要重新配置数据信息&…

DDOS渗透与攻防(四)之应用层DoS攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 DDOS渗透与攻防(三)之socktress攻击 应用层DoS攻击 攻击协议原理介绍说明-应用层DoS 应用服务漏洞 服务代码存在漏洞&#xff0c;遇异常提交数据时程序崩溃应用处理大量并发请求能力…

Git(见Docx)

Git的概念【1】Git技术&#xff1a;公司必备&#xff0c;一定要会 【2】Git概念&#xff1a; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的项目。【3】什么是版本控制&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#…

Redis 发布订阅模式的深度解析与实现消息队列

1 发布订阅模式(Pub/Sub)的概述我们可以利用Redis的List数据结构实现一个简单的消息队列&#xff0c;通过lpush命令写入消息&#xff0c;通过rpop 命令拉取消息&#xff0c;也可以使用BRPOP实现阻塞式的拉取消息。上面的消息队列有一个缺点&#xff0c;那就是不支持消息多播机制…

百趣代谢组学文献分享:以猪为模型检测哺乳动物之间的代谢物交换

百趣代谢组学文献分享&#xff0c;您对哺乳动物不同器官之间的代谢物交换情况了解吗&#xff1f; 本期百趣代谢组学小趣给大家分享的是美国普林斯顿大学Joshua D. Rabinowitz团队发表在Cell Metabolism上的研究成果。该团队以猪为模型&#xff0c;利用高通量靶标技术定量测定了…

QEMU/KVM带与不带音频驱动参数的实际区别

实际工作中用到QEMU/KVM&#xff0c;按照书中的命令启动虚拟机后&#xff0c;发现Ubuntu镜像启动后找不到声卡设备&#xff0c;经过一番搜索和尝试&#xff0c;最终发现是“-device ac97”这一关键选项所导致的。现将具体的对比结果记录如下&#xff1a; 不带“-device ac97”…

2023编程语言趋势

2023编程语言趋势 作为CTO&#xff0c;我需要持续关注编程语言的发展。按照惯例&#xff0c;每年年初我都会对未来一年关键编程语言的趋势做一定的预判。今年由于众所周知的原因&#xff0c;预测地有些晚&#xff0c;我选择在开年的第一天给出我的预测&#xff0c;也算是祝大家…

(Java高级教程)第四章必备前端基础知识-第三节2:JavaScript数组、函数和对象

文章目录一&#xff1a;数组二&#xff1a;函数三&#xff1a;对象一&#xff1a;数组 数组&#xff1a;JavaScript中的数组和Java中的ArrayList有点相似&#xff0c;可以动态扩容&#xff0c;并且由于它是动态类型的语言&#xff0c;所以数组内的元素类型不要求一定是相同的 …

【Git】安装搭建与相关概念

目录 1. 安装 1.1出现安全警告&#xff0c;点击运行 1.2浏览协议&#xff0c;下一步 1.3安装目录&#xff0c;所需要磁盘空间大小&#xff0c;下一步 1.4Git Bash需要安装的&#xff0c;其他默认即可&#xff0c;下一步 1.5开始菜单&#xff0c;下一步 1.6默认编辑器&…

《MySQL高级篇》十三、锁

文章目录1. 概述2. MySQL并发事务访问相同记录2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.4 并发问题的解决方案3. 锁的不同角度分类3.1从数据操作的类型划分:读锁、写锁1. 锁定读2. 写操作3.2 从数据操作的粒度划分:表级锁、页级锁、行锁1. 表锁(Table Lock)① 表级别的…

JavaScript 练手小技巧:打字小游戏

放假闲来无事&#xff0c;一群小屁孩想玩我的电脑。 字都不会打&#xff0c;还玩电脑。 用 js 写一个打字游戏&#xff0c;打不到 100 分&#xff0c;就不要玩我的电脑~~~&#xff01;&#xff01;&#xff01; 整体界面如下所示&#xff0c;一切从简~ HTML 结构 <div i…

正则表达式-学习笔记

正则表达式&#xff08;Regular Expression&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff1a;a到z之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字…

企业如何利用生产制造业ERP管理系统做好采购管理?

采购对生产制造业企业而言&#xff0c;至关重要&#xff01;采购成本能够占到很多企业经营成本的60%左右&#xff0c;而所采购物料的质量直接决定了产品的质量。而在生产制造企业的采购工作中&#xff0c;经常会出现一些问题&#xff0c;比如&#xff1a;采购成本难控、采购流程…

Elasticsearch(五)--ES文档的操作(上)---写入文档

一、前言 使用ES构建搜索引擎时需要经常对文档进行操作&#xff0c;除了简单的单条文档操作&#xff0c;有时还需要进行批量操作。我们这章主要学习ES文档的增删改的操作&#xff0c;由于涉及到的代码量会比较多&#xff0c;所以分为3篇文章分别说明文档的这个三个操作。那么我…

星环科技TDH多模型统一架构VS CDH架构

CDH是Cloudera的开源平台发行版&#xff0c;通过将Hadoop与其他十几个开源项目集成&#xff0c;为企业大数据业务提供服务。 在CDH开源大数据方案中&#xff0c;是通过多个互相独立的组件提供相应的能力&#xff0c;每个场景需要一个组件独立交付&#xff0c;为了实现不同业务…