3723. 字符串查询:做题笔记

news2024/9/23 1:42:00

目录

思路 

代码

注意点 


3723. 字符串查询

思路 

这道题感觉和常见的前缀和问题不太一样,前缀和的另一种应用:可以统计次数

这道题我们想判断一个单词的其中一段子序列A是否可以通过重新排列得到另一段子序列B。

我看到这道题的时候想着可能要判断这一段中存在的元素是否在相比较的序列中存在,额可能要用到二分查找?等等,挺麻烦的。而且这样没有考虑到如果存在两个相同的字母,好像并没有想到处理这种情况。

所以大体的思路应该是:我们判断A序列中是否存在某个字母且其个数是否和B序列中完全符合

那么前缀和在这里的作用就是按照字母统计出:该单词中每个字母在每个前缀中的个数

也就是我们之前前缀和的对象都是数字,这里我们的操作对象是字母。

一共有26个字母,因此要分别计算出这26个字母对应的前缀和,比较好的处理方式就是创建一个二维数组,行数直接为26。利用列来表示每个字母对应的前缀和

(我们这里主要利用二维数组来方便表示含义,不需要联想到实际的二维数组。记得之前在tire字符串统计算法里我们就是这样利用二维数组的,原来这样利用二维数组含义方便表示还怪常见哩hh)

由于要计算26轮前缀和,因此我们的循环最外层就是控制计算26轮的,且其指针刚好也可以代表着字母顺序,内部循环就是我们正常的前缀和步骤:遍历这个单词,如果遍历到的字母是我们目前正在统计的字母的前缀和,那么就利用前缀和计算公式q[i]=q[i-1]+a[i],由于这里我们只是统计次数,a[i]只有两种可能0/1,因此不需要多创建,直接用if语句实现即可。

(注意如何判断遍历到的字母是我们目前正在统计的字母?就是将当前字母 -a字符 得到的就是该字母在第几位,也就是我们最外层循环此时的轮数。[我们将字母用从0-25的数字来表示了])

统计出前缀和之后就是判断两段子序列中字母是否匹配了。

我们输入的abcd就是前缀和的某两个区间。我们遍历这两个区间的26个字母是否个数都相同,只要出现一个不同的就不符合题意。

代码

#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=1e5+10;
int s[26][N];
char str[N];
signed main()
{
	/*
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);*/
	
	scanf("%s",str+1);//前缀和从下标为1开始
	for(int i=0;i<26;i++)
	{
		for(int j=1;str[j];j++)
		{
			if(str[j]-'a'==i)s[i][j]=s[i][j-1]+1;
			else s[i][j]=s[i][j-1];
		}
	}
	int q;
	cin>>q;
	while(q--)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		bool st=1;
		for(int i=0;i<26;i++)
		{
			if(s[i][b]-s[i][a-1]!=s[i][d]-s[i][c-1])
			{
				st=0;
				break;
			}
		}
		if(st)puts("DA");
		else puts("NE"); 
	}
	return 0;
}

注意点 

注意我们这里由于输入的是字符串,但是我们想利用前缀和,我们希望输入的时候从字符串的第二位也就是下标为1的位置开始存储,所以我们使用scanf输入,采用这样的形式

scanf("%s",str+1);

来实现。

那么我们使用了scanf,就不能再写对于cin/cout的提速的内容了。下面是解释:

习惯一下用puts实现输出内容。

这里想再记一下做另一道题的时候我用了sort函数,但没用对。在这里补充一下关于sort函数

sort(begin, end):对数组或容器中的元素进行排序。begin 是指向待排序区间第一个元素的指针或迭代器,end 是指向待排序区间最后一个元素的下一个位置的指针或迭代器

注意这个函数的参数类型。

如果想对一个,下标从0开始有n+1个元素的b[]数组进行排序:

sort(b,b+n);

不要这样写:sort(b[1],b[n])

如果我们创建的是vector类型的数组,对其元素进行排序,那么调用sort函数就需要用.begin(),.end()的参数写法

sort(myVector.begin(), myVector.end());

好啦写到这。(突然发现写文章里可以上传视频hh之前都是插链接😂)

有问题欢迎指出,一起加油!!!!

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

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

相关文章

Flutter 中的 ScrollNotification 为啥收不到

1. 需求 在做智家 APP 悬浮窗优化需求时&#xff0c;需要获取列表的滑动并通知悬浮窗进行收起或全部显示。 基础库同事已经把 基础逻辑整理好如下&#xff1a; NotificationListener<ScrollNotification>(onNotification: (notification){//1.监听事件的类型if (notif…

STM32实现三个串口同时开启发送接收数据

程序目的&#xff1a; 实现STM32开通三个串口&#xff0c;每个串口都可以实现接收和发送数据。 注意事项&#xff1a; 编程时&#xff0c;严禁在中断函数中写入发送串口数据代码&#xff0c;否则会出错&#xff0c;具体原因不清楚&#xff08;有大佬知道的话帮我指出&#xff…

C#String的remove的用法

string test "abc";string temp test;temp.Remove(0, 1);temp temp.Remove(0, 1);Console.WriteLine(temp);Console.WriteLine(test);执行结果

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

uniapp h5 touch事件踩坑记录

场景&#xff1a;悬浮球功能 当我给悬浮球设置了 position: fixed; 然后监听悬浮球的touch事件&#xff0c;从事件对象中拿到clientY和clientX赋值给悬浮球的left和top属性。当直接赋值后效果应该是这样子&#xff1a; 注意鼠标相对悬浮球的位置&#xff0c;应该就是左上角&a…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

力扣热门算法题 135. 分发糖果,146. LRU 缓存,148. 排序链表

135. 分发糖果&#xff0c;146. LRU 缓存&#xff0c;148. 排序链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.28 可通过leetcode所有测试用例。 目录 135. 分发糖果 解题思路 完整代码 Python Java 146. LRU 缓存 …

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…

【MagicDrive环境配置】新手配俩星期版

1.创建一个新的环境conda create -n newdrive python3.8 2.激活该环境conda activate newdrive 3.下载MagicDrive源码 git clone --recursive https://github.com/cure-lab/MagicDrive.git&#xff0c;如果出现时间超时八成是网的问题&#xff0c;直接自己下载解压就好 3.我的…

【群智能算法改进】一种改进的同核分子优化算法 IHMO算法【Matlab代码#71】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HMO算法2. 改进HMO算法2.1 改进的距离减小因子2.2 黄金正弦策略扰动 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HMO算法 同核分子优化算法&#x…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

网络原理-传输层-UDP报文结构

本文介绍UDP报文 有很多友友搞不清楚UDP报文的详细结构还有TCP的详细结构,所以专门分开来讲 以免弄混. 首先我们先看一下整个UDP结构,让大家有一个全方面的认识 下面我们来详细解释UDP报 16位源端口号(本机):就是2字节大小,16个二进制位. 16位目的端口号(目的机):也是2字节…

如何构建一台机器学习服务器

系统信息 系统安装 系统安装这里就不再赘述&#xff0c;推荐使用ventory作为PE盘&#xff0c;来安装系统&#xff0c;这样方便快捷&#xff0c;可同时包含多个镜像&#xff0c;无需重复制作&#xff0c;需要注意的是在安装系统的时候需要手动进行分区&#xff0c;我们可以看一下…

uniApp使用XR-Frame创建3D场景(3)光源投影的运用。

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解光源在场景中的运用以及相关属性。 在子组件 xr-start的index.wxml文件中我们加入如下代码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr…

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用

机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台&#xff0c;产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案&#xff0c;让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…

主机安全-德迅卫士

什么是主机安全&#xff1f; 主机安全&#xff0c;其核心内容包括安全应用交付系统、应用监管系统、操作系统安全增强系统和运维安全管控系统。它的具体功能是指保证主机在数据存储和处理的保密性、完整性&#xff0c;可用性&#xff0c;它包括硬件、固件、系统软件的自身安全&…

HCIA-Datacom H12-811 题库补充(3/28)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 OSPFv3使用哪个区域号标识骨干区域&#xff1f; A&#xff1a;0 B&#xff1a;3 C&#xff1a;1 D&#xff1a;2 答案&#xff1a;A 解析&#xff1a;AREA 号0就是骨干区域。 STP下游设备通知上游…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

啥也不会的大学生看过来,这8步就能系统入门stm32单片机???

大家好&#xff0c;今天给大家介绍啥也不会的大学生看过来&#xff0c;这8步就能系统入门stm32单片机&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 对于没有任何基础的大学生来…