数组中两个字符串的最短距离---一题多解(贪心/二分)

news2024/11/17 7:20:48

点击跳转到题目

方法:贪心 / 二分

目录

贪心:

二分:


贪心:

要找出字符串数组中指定两个字符串的最小距离,即找出指定字符串对应下标之差的最小值

思考:如果是直接暴力求解,需要两层for循环,依次判断是否是指定字符串,如果是,则找出当前指定字符串的最小距离;时间复杂度O(N^2),题目给的数据范围是10^5,是过不了的;

我们基于暴力求解的思路拓展,暴力解法中,我们在找每一个指定字符串的最小距离时,都是针对该字符串位置逐一枚举,那如果优化一下找指定字符串最小距离的方法呢?

在遍历数组的过程中,用两个变量记录str1、str2的最近下标,对于遍历到的每一个str1、str2,我们都计算该字符串与其左边元素中最小距离(因为左边元素是已经更新过了最近的下标),这样遍历一遍数组,更新保存最小值,即可。

时间复杂度为O(N)

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
string a[N];

int main()
{
	int n;
	cin>>n;
	string str1,str2;
	cin>>str1>>str2;
	for(int i=0;i<n;i++) cin>>a[i];
	int prev1,prev2;//str1、str2的最近下标
	prev1 = prev2 = -1;
	int ret = 1e6;
	
	//对于每个str1、str2,只计算他们左边的最近字符串
	for(int i=0;i<n;i++)
	{
		if(a[i] == str1)
		{
			if(prev2 != -1)
			{
				int t = i - prev2;
				ret = min(ret,t);
			}
			prev1 = i;
		}
		else if(a[i] == str2)
		{
			if(prev1 != -1)
			{
				int t = i - prev1;
				ret = min(ret,t);
			}
			prev2 = i;
		}
	}
	
	if(prev1 == -1 || prev2 == -1) cout<<-1<<endl;
	else cout<<ret<<endl;
	return 0;
}

二分:

要找出指定字符串对应下标之差的最小值,下标,是个天然有序的排列,具有单调性

开俩个vector,分别保存str1、str2在原数组中的下标,两个vector内存的元素都是单调递增且互相之间没有交集,对于枚举vector1内的所有元素在vector2中的边界,左边都小于vector1,右边都大于vector1,此时边界两边的l、r对应的,与vector1相减,一定是当前字符串的最小值。

时间复杂度为O(nlogm),其中n+m = N

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
string a[N];
vector<int> v1,v2; //分别存放str1、str2在a中的位置

int main()
{
	int n;
	string str1,str2;
	cin>>n>>str1>>str2;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		if(a[i] == str1) v1.push_back(i);
		if(a[i] == str2) v2.push_back(i);
	}
	
	
	if(v1.empty() || v2.empty())
	{
		cout<<-1<<endl;
		return 0;
	}
	
	int ret = 1e6;
	//枚举v1,二分v2
	for(int i=0;i<v1.size();i++)
	{
		int l = -1, r = v2.size();
		while(l + 1 < r)
		{
			int mid = l + r >> 1;
			if(v1[i] < v2[mid])
				r = mid;
			else
				l = mid;
		}
		//需要考虑到边界在v2的首尾时
		int t;
		if(l == -1)  t = v2[r] - v1[i];
		else if(r == v2.size())  t = v1[i] - v2[l];
		else  t = min(v2[r] - v1[i],v1[i] - v2[l]);
		ret = min(ret,t);
	}
	cout<<ret<<endl;
	return 0;
}

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

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

相关文章

浏览器跨标签页通信的方式都有哪些

跨标签页的实际应用场景&#xff1a; 1. 共享登录状态&#xff1a; 用户登录后&#xff0c;多个标签页中需要及时获取到登录状态&#xff0c;以保持一致的用户信息。这种情况&#xff0c;可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态&#xff0c;并通过…

面试不慌张:一文读懂FactoryBean的实现原理

大家好&#xff0c;我是石头~ 在深入探讨Spring框架内部机制时&#xff0c;FactoryBean无疑是一个关键角色&#xff0c;也是面试中经常出现的熟悉面孔。 不同于普通Java Bean&#xff0c;FactoryBean是一种特殊的Bean类型&#xff0c;它的存在并非为了提供业务逻辑&#xff0c;…

串口小项目 - 声控刷抖音

项目准备&#xff1a; orangepi02 语言 模块: SU-03T 电脑 接线: 语言模块 - orangepi VCC - 5V GND - GND B7(RX)--RX-5 orangepi 手机 通过usb 连接 实现思路图: 语言模块接收到语言信息&#xff0c;发送到 H616 去处理&#xff0c;H616再控制手机实现语言刷抖音的功能 …

(2022级)成都工业学院数据库原理及应用实验八: 数据库恢复技术

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、使用mysqldump实现数据库备份。 2、使用mysqldump实…

LCR 023. 相交链表

给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xf…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处&#xff1a; 对于浏览器来说&#xff0c;标签不够语义化对于搜索引擎来说&#xff0c;不利于SEO的优化 语义化标签&#xff1a; header:头部元素nav&#xff1a;导航section:定义文档某个区域的元素article:内容元素aside…

文心一言 VS 讯飞星火 VS chatgpt (241)-- 算法导论17.3 7题

七、为动态整数多重集 S (允许包含重复值)设计一种数据结构&#xff0c;支持如下两个操作&#xff1a;① INSERT(S,x) 将 x 插入 S 中&#xff1b;② DELETE-LARGER-HALF(S) 将最大的 ⌈|S|/2⌉ 个元素从S中删除。解释如何实现这种数据结构&#xff0c;使得任意 m 个 INSERT 和…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本&#xff1a;centos7 安装环境&#xff1a;vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

企业上云数字化转型的关键——选对服务器虚拟化

盘点市面上的主流虚拟化软件 虚拟化技术就像可以随意组合的乐高积木&#xff0c;可以高效、灵活地利用计算资源。世面上主流虚拟化很多&#xff0c;各有长处和短板。今天先来盘点一下市面上的主流虚拟化软件&#xff0c;一探究竟。 虚拟化的老牌巨头——VMware 老牌虚拟化巨…

Java数据结构-堆和优先级队列

目录 1. 相关概念2. PriorityQueue的实现2.0 搭建整体框架2.1 堆的创建和调整2.2 插入元素2.3 出堆顶元素 3. 全部代码&#xff08;包含大根堆和小根堆&#xff09;4. PriorityQueue的使用5. Top-K问题 之前我们学习的二叉树的存储方式是链式存储&#xff0c;&#xff08;不清楚…

VLOOKUP函数使用,为什么会报错“引用有问题”?

VLOOKUP函数的使用非常广泛&#xff0c;在excel2007版之后的软件中&#xff0c;使用VLOOKUP函数也许会遇到这样的场景&#xff0c;明明公式是没有问题的&#xff0c;公式还会报错“引用有问题”。 一、报错场景 输入公式后&#xff0c;回车确认&#xff0c;显示如下报错&…

嵌入式学习57-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices mknod ? 查看指令 gcc -oapp hello.c 字符设备驱动流程 字符设备程序运行流程 gcc中-c和-o是编译时可选的参数 -c …

揭阳硕榕超市管理系统的设计与实现(论文)_kaic

摘 要 在互联网高速发展环境下&#xff0c;传统的管理手段无法满足对信息的高效、快速的管理要求。为顺应时代发展的需要&#xff0c;提高超市的管理效能&#xff0c;提高超市的管理速度&#xff0c;构建一个信息化的工作流程&#xff0c;揭阳硕榕超市管理系统应运而生。 根…

Jmeter04:关联

1 Jmeter组件&#xff1a;关联 概括&#xff1a;2个请求之间不是独立的&#xff0c;一个请求响应的结果是作为另一个请求提交的数据&#xff0c;存在数据交互 1.1 是什么&#xff1f; 就是一个请求的结果是另一个请求提交的数据&#xff0c;二者不再是独立 1.2 为什么&#x…

Python 面向对象——1.基本概念

本章学习链接如下&#xff1a; 基本概念与语法 类&#xff08;Class&#xff09;&#xff1a;定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象&#xff08;Object&#xff09;&#xff1a;类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序&#xff0c;将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏&#xff0c;给天空盒添加time of lighting材质 打开材质里的衣服&#xff0c;发现只有一个衣服文件 …

【Canvas与艺术】绘制黑白山间野营Camping徽章

【说明】 中间的山月图是借用的网上的成图&#xff0c;不是用Canvas绘制的。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址&#xff1a;API平台源码 这套源码是使用thinkphp3.1.3开发的&#xff0c;可以在PHP5.3-5.6下运行&#xff0c;程序是有一点老了&#xff0c;但是思路仍在&#xff01;然后&#xff0c;这套源码我已经成功搭建起来了&#xff0c;后台、个人&#xff08;用户&#xff0…

跟TED演讲学英文:How AI could save (not destroy) education by Sal Khan

How AI could save (not destroy) education Link: How AI could save (not destroy) education Speaker: Sal Khan Date: April 2023 文章目录 How AI could save (not destroy) educationIntroductionVocabularyTranscriptSummary后记 Introduction Sal Khan, the founder…

【UE5 C++】VS2022下载安装

先看一下UE和VS的兼容性 &#xff08;虚幻5&#xff1a;为虚幻引擎C项目设置Visual Studio开发环境&#xff09; &#xff08;虚幻4&#xff1a;设置虚幻引擎的Visual Studio&#xff09; 为了让VS更好兼容UE5&#xff0c;因此这里下载VS2022版本 步骤 1. 进入Visual Stud…