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

点击跳转到题目

方法:贪心 / 二分

目录

贪心:

二分:


贪心:

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

思考:如果是直接暴力求解,需要两层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.mfbz.cn/a/551931.html

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

相关文章

牛客 2024 【牛客赛文X】春招冲刺 ONT73 体育课测验(二) 【中等 图/拓扑排序 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/64a4c026b2aa4411984f560deec36323 思路 图&#xff0c;BFS&#xff0c;队列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…

【Linux--多线程】

1 . Linux线程概念 1.1 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部执行&#xff0c;本质是在进程地址空间内运行 Linux系…

北京InfoComm展推出500款新品,覆盖30个市场,助力行业未来

【2024年4月17日——北京讯】亚太区首屈一指的专业视听和集成体验解决方案展北京InfoComm China 2024 今天在北京的国家会议中心 (CNCC) 盛大开幕&#xff0c;展开为期三天的商贸展会和高峰会议。作为行业产品发布的首要平台&#xff0c;北京InfoComm China吸引众多展商携新品推…

代码随想录阅读笔记-回溯【重新安排行程】

题目 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开…

claude国内不能用

AnthropicAI 公司旗下的Claude 3 大型语言模型&#xff0c;以其卓越的性能直接挑战了GPT-4的市场地位。Claude 3 系列中包含了几个不同版本&#xff0c;如Claude 3 Opus、Claude 3 Sonnet 以及 Claude 3 Haiku&#xff0c;每个版本都针对特定的应用场景进行了优化。 在这些版本…

一款国产的开发辅助AI插件!

文章目录 一 Comate 介绍二 价格三 安装四 体验4.1 智能推荐4.1.1 单行推荐4.1.2 多行推荐 4.2 智能生成4.2.1 注释生成代码4.2.2 增强生成代码4.2.3 生成单元测试4.2.4 生成代码注释文档注释行间注释 4.3 代码解释4.4 调优建议4.5 长函数拆分 五 智能问答六 其他能力6.1 插件配…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

全国产化无风扇嵌入式车载电脑农耕车辆/钢厂天车行业应用

农耕车辆行业应用 背景介绍 当前农耕车车载电脑主要的功能&#xff0c;是要实现农耕车的精确的定位和导航&#xff0c;更加先进的系统则要实现农耕车自动驾驶&#xff0c;与农耕车上相关传感器的通讯(例如耕土深度的传感器, 油量存量传感器…)来实现更多的自动化、信息化的功能…

GPT-4最新详解:能力对比,语言,视觉输入,操纵性,聊天GPT Plus等

OpenAI创建了 GPT-4&#xff0c;这是 OpenAI 扩大深度学习努力的最新里程碑。 GPT-4 是一个大型多模态模型&#xff08;接受图像和文本输入&#xff0c;发出文本输出&#xff09;&#xff0c;虽然在许多现实场景中能力不如人类&#xff0c;但在各种专业和学术基准上表现出人类水…

新书速览|Vue.js+Node.js全栈开发实战

掌握Vue.js、Node.js、MySQL全栈开发方法 本书内容 《Vue.jsNode.js全栈开发实战》以掌握Web全栈开发技术为目标&#xff0c;以Node.js和Vue.js原生开发和项目实战为主线&#xff0c;详细介绍Node.js Vue.js全栈开发技术。本书内容丰富、实例典型、实用性强&#xff0c;配套示…

从入门到精通C++之类和对象(续)

目录 初始化列表构造函数&#xff1f;拷贝构造&#xff1f;浅谈explicit关键字友元 内部类static成员总结 初始化列表 引入初始化列表&#xff1a;简化代码&#xff0c;提高效率 在编程中&#xff0c;初始化列表是一种用于在创建对象时初始化成员变量的快捷方式。通过初始化列…

Linux第89步_了解异步通知及其结构和函数

1、了解“异步通知” “异步通知”的核心就是信号。信号是采用软件模拟的“中断”&#xff0c;它由“驱动程序”主动向“应用程序”发送信号&#xff0c;并报告自己可以访问了&#xff0c;“应用程序”收到信号以后&#xff0c;就从“驱动设备”中读取或者写入数据。整个过程就…

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取|电商数据API接口网页爬虫、采集网站数据

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电…

@Scheduled注解简介

一、注解介绍 Scheduled注解是Spring Boot提供的用于定时任务控制的注解&#xff0c;主要用于控制任务在某个指定时间执行&#xff0c;或者每隔一段时间执行。 二、源码 package org.springframework.scheduling.annotation;import java.lang.annotation.Documented; import…

【服务器部署篇】Linux下Nacos安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

中科国声携新品亮相北京InfoComm China 2024展

4月17日&#xff0c;北京InfoComm China 2024展&#xff08;北京专业视听技术和集成体验解决方案展览会&#xff09;在北京的国家会议中心盛大开幕。展会为期三天。作为备受瞩目的”会议系统国家队“&#xff0c;中科国声携众多优质会议音频产品及全新会议系统解决方案精彩亮相…

贪心算法简介

目录 一、什么是贪心算法&#xff1f; 二、贪心算法的特点 三、贪心算法解决找零问题、最短路径问题、背包问题 1.找零问题 2.最短路径问题 3.背包问题 一、什么是贪心算法&#xff1f; 贪心算法就是希望通过局部最优来解决全局最优 基本步骤&#xff1a;1.将问题分为若…

「每日跟读」英语常用句型公式 第14篇

「每日跟读」英语常用句型公式 第14篇 1. As far as __ is concerned 就__ 而言 As far as the project timeline is concerned, we’re running ahead of schedule. &#xff08;就项目时间表而言&#xff0c;我们进度超前了。&#xff09; As far as the exam results ar…

第20天:信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

第二十天 一、工具项目-红蓝队&自动化部署 自动化-武器库部署-F8x 项目地址&#xff1a;https://github.com/ffffffff0x/f8x 介绍&#xff1a;一款红/蓝队环境自动化部署工具,支持多种场景,渗透,开发,代理环境,服务可选项等.下载&#xff1a;wget -O f8x https://f8x.io…

Oracle执行计划优化SPM案例

1.现象 执行下面这段代码&#xff0c;发现子库存表走了全表扫描 SELECT msi.secondary_inventory_name, --子库存msi.description --库存说明FROM inv.mtl_secondary_inventories msi,csi_item_instances ciiWHERE msi.secondary_inventory_name cii.inv_subinve…