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

目录

思路 

代码

注意点 


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之前都是插链接😂)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签

1 方案一&#xff1a;命令 cd <项目目录> git fetch --all git fetch --tags git remote rename origin old-origin #可以不保留 git remote add origin http://***(项目的新仓库地址) #git remote set-url origin <项目的新仓库地址> git push origin --all git…

Qt 多线程QThread的四种形式

重点&#xff1a; 1.互斥量&#xff1a;QMutex配套使用&#xff0c;lock(),unlock(),如果一个线程准备读取另一个线程数据时候采用tryLock()去锁定互斥量&#xff0c;保证数据完整性。 QMutexLocker简化版的QMutex,在范围区域内使用。 QMutex mutex QMutexLocker locker(&…

达梦数据库新手上路排坑

数据库安装 这个没啥说的&#xff0c;按照官网教程操作&#xff0c;我使用的是docker进行安装 下载文件docker文件 官方下载地址- load -i dm8****.tar (注意修改为当前下载的文件)达梦官方文档注意修改为当前版本 docker run -d -p 5236:5236 --name dm8 --privilegedtrue -…

程序员口才提升技巧:从技术到沟通的进阶之路

程序员口才提升技巧&#xff1a;从技术到沟通的进阶之路 在数字化时代&#xff0c;程序员作为推动技术发展的关键角色&#xff0c;其专业能力的重要性不言而喻。然而&#xff0c;除了编程技能外&#xff0c;良好的口才同样是程序员职业生涯中不可或缺的一部分。本文将探讨程序…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

2024-3-28 市场情绪强修复

这一轮退潮负反馈都修复了&#xff0c; 艾艾精工 博信股份 安奈尔 永悦科技 大理药业 &#xff0c;高新发展 也补跌了&#xff0c;收尸队也干活了&#xff0c;情绪不修复不接力得最好写照。这轮周期 宁科生物 已经7板&#xff0c;已经追平了 博信股份7板&#xff0c;看明天溢…

永磁同步电机速度环滑膜控制(SMC)

文章目录 1、前言2、滑膜控制基本原理2.1 滑膜控制的定义2.2 趋近率 3、滑膜控制器的设计与参数4、二阶滑膜速度控制器的设计5、二阶速度环滑膜控制仿真5.1 模型总览5.2 电机及系统参数5.3 滑膜控制模块5.4 控制效果对比 参考 写在前面&#xff1a;本人能力、时间、技术有限&am…

广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

明天线上见!DPU构建高性能云算力底座——DPU技术开放日最新议程公布!

算力&#xff0c;是数字经济时代的新质生产力。随着人工智能、智算中心建设等需求不断拓展&#xff0c;DPU在各行各业数据中心的应用逐步深入。异构算力代表DPU在新质生产力建设中&#xff0c;能否给出别开生面的答案&#xff0c;应战算力难题&#xff1f;DPU技术在不同行业中的…

详细解析记忆泊车的顶层技术原理

详细解析记忆泊车的顶层技术原理 附赠自动驾驶学习资料和量产经验&#xff1a;链接 相对于记忆行车而言&#xff0c;记忆泊车 MPA&#xff08;Memory Parking Assist&#xff09;可以看成是停车场区域内的一个自动驾驶功能&#xff0c;可帮助用户按记忆的路线自动巡航并泊入车…

Vue2 与 Vue3的面试题

1.Promise有几种状态 pending(进行中) fulfilled(已成功) rejected(已失败) data(){return{}},create(){const result this.ganaretor()result.next.value.then((res)>{console.log(res);}) // 解决一直.then()方法问题},methods:{* ganaretor(){yield axios.get(httpts)…

vulnhub靶场之driftingblues-3

一.环境搭建 1.靶场描述 get flags difficulty: easy about vm: tested and exported from virtualbox. dhcp and nested vtx/amdv enabled. you can contact me by email for troubleshooting or questions. This works better with VirtualBox rather than VMware 2.靶场…

【前端面试3+1】01闭包、跨域、路由模式

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

天锐绿盾|公司如何防止员工拷贝电脑资料?

#天锐绿盾# 天锐绿盾是一款针对企业数据安全设计的终端安全管理软件&#xff0c;用来防止员工拷贝电脑资料的具体措施包括&#xff1a; www.drhchina.com PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 1. **文件透明加密…

10.对象的使用,遍历

什么是对象 其实就是map那种键值对的存储形式&#xff0c;别的语言也有&#xff0c;老规矩&#xff0c;和别的语言差不多的就在给pink老师打一波广告。 常见的对象操作&#xff0c;其实没啥直接上代码吧 <!DOCTYPE html> <html> <head><meta charset&…

网络套接字补充——UDP网络编程

五、UDP网络编程 ​ 1.对于服务器使用智能指针维护生命周期&#xff1b;2.创建UDP套接字&#xff1b;3.绑定端口号&#xff0c;包括设置服务器端口号和IP地址&#xff0c;端口号一般是2字节使用uint16_t&#xff0c;而IP地址用户习惯使用点分十进制格式所以传入的是string类型…

【常见面试题】JS 发布者、订阅者模式

面试中经常出现问到如何实现JS 发布者、订阅者模式。下面是ES5实现发布订阅模式。 1、直接上代码。 function EventEmitter() {this.events {}; }; // 订阅者 EventEmitter.prototype.on function(ename, callback) {if (!this.events[ename]) {// 初始化创建订阅&#xff…

C++ 控制语句(二)

一 break continue和goto语句 1 break语句 在switch语句中&#xff0c;分隔case子句&#xff0c;跳出switch语句。 在循环语句中可以立即终止循环语句的执行。 2 continue语句 功能:在一次循环过程中,跳过continue语句以下的语句,直 接进入下一次循环操作。 3 goto语句 …

软考98-上午题-【信息安全】-防火墙

一、考试概述 该内容与计算机网络关联。 分值&#xff1a;2分 二、防火墙 防火墙 (Firewall) 是建立在内外网络边界上的过滤封锁机制&#xff0c;它认为内部网络是安全和可信赖的&#xff0c;而外部网络是不安全和不可信赖的。 防火墙的作用是防止不希望的、未经授权地进出…

CCF-CSP认证考试 202303-5 施肥 35/60/75/100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202303-5 施肥 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 1.0GB 问题描述 春天到了&#xff0c;西西艾弗岛上的 n n n 块田地需要施肥了。 n n n 块田地编号为 1 , 2…