笔试题2 -- 字符串数组中指定字符串间的最短距离

server/2024/9/20 6:09:36/ 标签: 哈希算法, 算法, c++, string, 字符串

字符串数组中指定字符串间的最短距离

文章目录

  • 字符串数组中指定字符串间的最短距离
    • 题目还原
    • 解法一:暴力遍历 (HashVector法)
    • 解法二:算法改进 (双指针法)
    • 总结

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

题目还原

给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。

  • 输入描述:

输入包含有多行。第一输入一个整数n (1≤n≤10^5) ,代表数组strs的长度。第二行有两个字符串分别代表 str1 和 str2,接下来n行,每行一个字符串,代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。

  • 输出描述:

输出一行,包含一个整数,代表返回的值。

备注:

时间复杂度O(n),额外空间复杂度O(1)

解法一:暴力遍历 (HashVector法)

思路摘要

通过创建一个哈希向量来标记str1str2在数组中的位置,然后通过两个嵌套循环来查找最小距离。

// 利用哈希关系对应 str1 和 str2 找到的位置
vector<int> HashVector(const vector<string>& strs, const string& str1, const string& str2)
// 遍历哈希表找到两字符串间的最短距离
int LowerWay(const vector<int>& v)

代码示例:

#include string"><iostream>
#include string"><string>
#include string"><vector>
#include string"><climits>using namespace std;vector<int> HashVector(const vector<string>& strs,const string& str1, const string& str2) {// str1对应位置设为1,str2对应位置设为2// 否则为0int n = strs.size();vector<int> hash_v(n, 0);for (int i = 0; i < n; i++) {if (strs[i] == str1) {hash_v[i] = 1;} else if (strs[i] == str2) {hash_v[i] = 2;}}return hash_v;
}int LowerWay(const vector<int>& v) {int n = v.size();int min = INT_MAX;bool have_s1 = false;bool have_s2 = false;for (auto e : v) {if (e == 1) {have_s1 = true;}if (e == 2) {have_s2 = true;}}if (!have_s1 || !have_s2) {return -1;}for (int i = 0; i < n; i++) {if (v[i] != 1) {continue;}for (int j = n - 1; j > 0; j--) {if (v[j] != 2) {continue;}int length = abs(i - j);min = (min < length) ? min : length;}}for (int i = 0; i < n; i++) {if (v[i] != 2) {continue;}for (int j = n - 1; j > 0; j--) {if (v[j] != 1) {continue;}int length = abs(i - j);min = (min < length) ? min : length;}}return min;
}void test() {// 接收输入int n = 0;cin >> n;string str1;string str2;cin >> str1 >> str2;if (str1.empty() || str2.empty()) {cout << -1 << endl;return;}vector<string> strs(n);for (int i = 0; i < n; i++) {cin >> strs[i];}vector<int> v = HashVector(strs, str1, str2);cout << LowerWay(v) << endl;
}int main() {test();return 0;
}

提交截图:

在这里插入图片描述

评价:

这种方法在处理大数据集时可能会有性能问题,因为它的时间复杂度为O(n^2)。

解法二:算法改进 (双指针法)

思路摘要

在遍历数组时,记录下str1str2最后出现的位置,并实时更新最小距离。

代码示例:

#include string"><iostream>
#include string"><string>
#include string"><vector>
#include string"><limits>using namespace std;int findMinDistance(const std::vector<std::string>& strs, const std::string& str1, const std::string& str2) {int minDistance = std::numeric_limits<int>::max();int lastPos1 = -1, lastPos2 = -1;for (int i = 0; i < strs.size(); ++i) {if (strs[i] == str1) {lastPos1 = i;// 当str2也已找到时,计算距离if (lastPos2 != -1) {minDistance = std::min(minDistance, abs(lastPos1 - lastPos2));}} else if (strs[i] == str2) {lastPos2 = i;// 当str1也已找到时,计算距离if (lastPos1 != -1) {minDistance = std::min(minDistance, abs(lastPos1 - lastPos2));}}}// 如果str1或str2未在数组中找到,返回-1if (lastPos1 == -1 || lastPos2 == -1) {return -1;}return minDistance;
}int main() {int n;std::cin >> n;std::string str1, str2;std::cin >> str1 >> str2;std::vector<std::string> strs(n);for (int i = 0; i < n; ++i) {std::cin >> strs[i];}int result = findMinDistance(strs, str1, str2);std::cout << result << std::endl;return 0;
}

提交截图:

在这里插入图片描述

评价:

这种方法的时间复杂度为O(n),在处理大数据集时更加高效。


总结

​ 本文中我们探讨了两种不同的C++解题方法。从基本的暴力法到更高效的优化算法,我们不仅学习了如何实现它们,还了解了如何分析它们的性能,并在实际应用中做出合适的选择。


http://www.ppmy.cn/server/6503.html

相关文章

【代码】Python3|用Python PIL压缩图片至指定大小,并且不自动旋转

代码主体是GPT帮我写的&#xff0c;我觉得这个功能非常实用。 解决自动旋转问题参考&#xff1a;一行代码解决PIL/OpenCV读取图片出现自动旋转的问题&#xff0c;增加一行代码image ImageOps.exif_transpose(image) 即可恢复正常角度。 from PIL import Image, ImageOpsdef …

ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

前言 前面的几篇文章讲了很多 JWT 的优点&#xff0c;但作为技术人员都知道&#xff0c;没有一种技术是万能的 “银弹”&#xff0c;所谓有矛就有盾&#xff0c;相比 Session、Cookie 等传统的身份验证方式&#xff0c;JWT 在拥有很多优点的同时&#xff0c;也有着不可忽视的缺…

nginx访问路径映射服务器资源文件

当我们需要用直接通过url访问服务器上的静态资源&#xff08;如HTML、CSS、JavaScript、图片、视频等文件&#xff09;&#xff0c;而服务器本身没有fastDFS等文件分布式系统时&#xff0c;我们可以通过nginx配置文件目录映射来达到该效果。这种映射通常通过配置location指令来…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

又来!黄金主题LOF(161116)溢价40%开放申购,拖拉机都开冒烟了!

查看基金公告&#xff0c;黄金主题LOF(161116)下周一(4月22号)开放申购&#xff0c;限额100元&#xff0c;目前溢价40%&#xff0c;可以一拖七套利。 这熟悉的配方&#xff0c;这熟悉的套路&#xff01;一个月前的今天&#xff0c;我好像在标普500LOF上见过。又是易方达这个狗基…

竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

liteide 找不到 go 路径错误修复

在配置文件&#xff1a;C:\Users\iwlb\AppData\Roaming\liteide\liteide.ini中修改 [liteenv] currentenvidwin64 改为 [liteenv] currentenvidsystem 启动脚本: set GO111MODULEoff set GOROOTM:\work\tool\go1.21.2.windows-amd64 set GOPATHM:\work\code\go set PATHM:\…

python用循环新建多个列表

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 当我们处理数据时&#xff0c;有时候需要创建多个列表以存储不同类型或不同条件下的数据。在…

Java web应用性能分析之客户端慢

客户端慢的原因包括&#xff1a; 终端设备老化&#xff08;手机、PAD、电脑年限久远、运行期间产生了很多垃圾未清除&#xff09;终端网络设备老化&#xff08;路由器、交换机老化&#xff09;跟我们使用的手机一样&#xff0c;路由器也需要及时更新换代&#xff0c;否则硬件跟…

新手理解Hugging Face:与Docker Hub对比,理解Hugging Face到底是啥东西

可以将Hugging Face类比为Docker Hub&#xff0c;但它们之间有一些关键区别。我们将分别解释它们的相似之处和不同之处。 相似之处&#xff1a; 集中存储&#xff1a;Hugging Face Hub和Docker Hub都是集中式存储库&#xff0c;提供了一个可供用户查找、分享和使用的模型或镜…

Python与设计模式之适配器的使用方法

适配器模式&#xff1a;将一个类的接口转换成客户希望的另一个接口&#xff0c;适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 主要有两个实现方式&#xff1a; 1.使用继承--类适配器 2.使用组合--对象适配器 适用场景 1.想使用一个已经存在的类&a…

Java高阶私房菜:高并发之线程池底层原理学习

目录 什么是池化思想 什么是线程池 JDK中线程池关键类&#xff08; ThreadPoolExecutor&#xff09; 线程池设计原理和核心参数配置 ​编辑线程拒绝策略 Executors创建常见线程池种类 工具类创建线程池 应用场景问题解析 商品详情页聚合接口 商家管理后台业务报表数据…

Mac多媒体播放器 Movist Pro v2.11.4中文激活版下载

Movist Pro for Mac是一款专业的媒体播放器&#xff0c;特别为Mac用户设计。它不仅界面简洁美观&#xff0c;而且功能强大&#xff0c;能满足用户各种播放需求。 Movist Pro v2.11.4中文激活版下载 首先&#xff0c;Movist Pro for Mac支持多种媒体文件的播放&#xff0c;包括视…

鸢尾花数据集分类(决策树,朴素贝叶斯,人工神经网络)

目录 一、决策树 二、朴素贝叶斯 三、人工神经网络 四、利用三种方法进行鸢尾花数据集分类 一、决策树 决策树是一种常用的机器学习算法&#xff0c;用于分类和回归任务。它是一种树形结构&#xff0c;其中每个内部节点表示一个特征或属性&#xff0c;每个分支代表这个特征…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

微信小程序手机授权报错:pad block corrupted

微信小程序手机号授权登录&#xff0c;传参至后台解密&#xff0c;大概率都会成功&#xff0c;但是&#xff0c;偶尔会遇到解密失败&#xff0c;报错信息为&#xff1a; javax.crypto.BadPaddingException: pad block corrupted&#xff1b;在此记录一下解决方案。 更改前获取…

RAG与LLM本身知识存在冲突时,大模型如何抉择?

原文&#xff1a;https://arxiv.org/pdf/2404.10198.pdf 引言 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;因其强大的语言理解和生成能力而备受关注。然而&#xff0c;这些模型在处理特定问题时可能会产生错误信息&#xff0c;即所谓的“幻觉”&…

【笔记】vscode debug进入site-packages包源码

选择左侧栏第三个图标&#xff0c;点击创建 launch.json 文件 选择 Python Debugger 选择Python文件 这里可以看到launch.json 文件 在configurations中添加键值对 "justMyCode": false在文件中打上断点&#xff0c;点击"三角符"号开始调试 按F11或者红框…

力扣111. 二叉树的最小深度

思路&#xff1a;后序遍历左右中&#xff0c;但与最大深度细节上有大不同&#xff1a; 1、左右有一个为空时&#xff0c;取不为空的最小高度 2、都不为空时&#xff0c;对比左右深度取最小&#xff1b; 3、都为空时取0&#xff0c;可忽略&#xff1b; class Solution {public …

MATLAB 获取时间戳

说明 首先使用tic函数开始计时&#xff0c;然后使用toc函数获取从开始计时到当前的秒数&#xff0c;即时间戳。 最后&#xff0c;将时间戳赋值给变量timestamp&#xff0c;可以在后续使用。 需要注意的是&#xff0c;tic函数和toc函数必须成对使用。也就是说&#xff0c;每个…