数组中两个字符串的最小距离问题

news/2024/9/24 22:10:17/

 

目录

一·题目:

二·思路:

三·代码:


一·题目:

 

牛客网题目链接:数组中两个字符串的最小距离_牛客题霸_牛客网  

二·思路:

一开始就是二话没想看到时间复杂度是o(N)就想到肯定不能直接来回遍历去寻找,于是就想到把出现str1和str2下标记录下来然后去比较差值。于是,就搞了,下面复杂版的代码后面展示,不过这里更推荐下面的那种简单的解法

 

这里有简单的思路也就是后面看了大佬的题解才发现利用指针记录下标完全把问题简单话了,下面看一下具体思路:

思路:主要说下写法1:即它说复杂度要o(n)故也就是对这个strs只能走一遍,因此,还要判断str1,str2的下标最小值,故这里用个min函数,也就说最优就是当我们遍历的时候就边比较距离并求min,只要遇到str1,str2就记录,i每动一次,就有可能导致下标变化因此就可能导致求min,注:绝对值求距离。

三·代码:

3.1复杂版解答:

#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;int main() {int ret = 0x3f3f3f3f;//整型最大值int n;cin >> n;getchar();//读取cin剩下的\nstring str1, str2;getline(cin, str1, ' ');getline(cin, str2);//由题可知是\n为最后一个终止符vector<string> strs;for (int i = 0; i < n; i++) {string s;getline(cin, s);strs.push_back(s);}int flag1 = 0, flag2 = 0;for (int i = 0; i < strs.size(); i++) {//判断是否在strs都出现了if (str1 == strs[i]) flag1 = 1;if (str2 == strs[i]) flag2 = 1;}if (flag1 == 1 && flag2 == 1) {set<int> v1, v2;//使用set对下标排序:for (int j = 0; j < strs.size(); j++) {if (strs[j] == str1) {v1.insert(j);}if (strs[j] == str2) {v2.insert(j);}}set<int> s, f;if (v1.size() < v2.size()) s = v1, f = v2;else s = v2, f = v1;for (auto a : s) {//这里遍历短的那个下标数组,去长的中找比它大或比它小,差就有可能是auto cur = f.upper_bound(a);if (cur != f.begin()) {auto tmp = --cur;//set支持双向迭代器,会改变curcur++;ret = min(ret, abs(*(tmp) - a) > abs(*(cur) - a) ? abs(*(cur) - a) : abs(*(tmp) - a));} else ret = min(ret, *(cur) - a);}}if (ret != 0x3f3f3f3f) cout << ret << endl;else cout << -1 << endl;}

3.2优化版本:

#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
int main() {int n;cin>>n;getchar();string str1,str2;getline(cin,str1,' ');getline(cin,str2);vector<string> v(n);int ret=0x3f3f3f3f;int pre1=-1,pre2=-1;for(int i=0;i<n;i++) cin>>v[i];for(int i=0;i<n;i++){if(v[i]==str1) pre1=i;if(v[i]==str2) pre2=i;if(pre1!=-1&&pre2!=-1) ret=min(ret,abs(pre1-pre2));}if(pre1==-1||pre2==-1) cout<<-1<<endl;//存在str1或者str2中的一个也是-1else cout<<ret<<endl;}


http://www.ppmy.cn/news/1529986.html

相关文章

【Kubernetes】日志平台EFK+Logstash+Kafka【理论】

一&#xff0c;日志处理方案 方案一&#xff0c;【EFK】&#xff1a;Elasticsearch Fluentd&#xff08;或Filebeat&#xff09; Kibana Elasticsearch&#xff08;简称&#xff1a;ES&#xff09;&#xff1a;实时&#xff0c;分布式存储&#xff0c;可扩展&#xff0c;日…

35岁程序员转行大模型岗位:详细学习路线,从零基础到精通2024最新

随着人工智能&#xff08;AI&#xff09;和深度学习技术的飞速发展&#xff0c;越来越多的技术人才开始考虑转向这一前沿领域。对于已经拥有丰富编程经验但希望转型到大模型开发领域的35岁程序员来说&#xff0c;虽然面临一定的挑战&#xff0c;但也具备了坚实的基础。本文将提…

【flex-shrink】计算 flex弹性盒子的子元素的宽度大小

计算以下两个子div的宽度大小&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

编译 Android 11源码

参考小米6 lineageos官方编译文档&#xff1a;https://wiki.lineageos.org/devices/sagit/build 单独编译 framework 以LineageOS18.1&#xff08;Android 11&#xff09;为例&#xff1a; 1、在源码根目录执行&#xff1a; make framework-minus-apex 2、用生成的framewo…

【Docker】如何让docker容器正常使用nvidia显卡

首先确保宿主机正常安装了显卡驱动 nvidia-smi打印显卡信息如下&#xff1a; 安装nvidia-container-toolkit工具 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker运行如下命令测试显卡是否在容器内可用 …

【ARM】A64指令介绍及内存屏障和寄存器

A64指令集介绍 ISA : Instruction System Architecture 指令集总结 跳转指令 使用跳转指令直接跳转&#xff0c;跳转指令有跳转指令B&#xff0c;带链接的跳转指令BL &#xff0c;带状态切换的跳转指令BX。 B 跳转指令&#xff0c;跳转到指定的地址执行程序。 BL 带链接的跳…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务&#xff0c;车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说&#xff0c;如何将自己的应用程序无缝集成到车载系统中&#xff0c;利用汽车的硬件和服务能力&#xff0c;是一个极具挑战性…

UWA支持鸿蒙HarmonyOS NEXT

华为在开发者大会上&#xff0c;宣布了鸿蒙HarmonyOS NEXT将仅支持鸿蒙内核和鸿蒙系统的应用&#xff0c;不再兼容安卓应用&#xff0c;这意味着它将构建一个全新且完全独立的生态系统。 为此&#xff0c;UWA也将在最新版的UWA SDK v2.5.0中支持鸿蒙HarmonyOS NEXT&#xff0c…