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

news2024/10/6 13:54:08

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

文章目录

  • 字符串数组中指定字符串间的最短距离
    • 题目还原
    • 解法一:暴力遍历 (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 <iostream>
#include <string>
#include <vector>
#include <climits>

using namespace std;

vector<int> HashVector(const vector<string>& strs,
                       const string& str1, const string& str2) {
    // str1对应位置设为1,str2对应位置设为2
    // 否则为0
    int 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 <iostream>
#include <string>
#include <vector>
#include <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未在数组中找到,返回-1
    if (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.coloradmin.cn/o/1601187.html

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

相关文章

速卖通、阿里国际站自养买家账号补单测评核心问题

补单在跨境电商中扮演着重要的角色&#xff0c;卖家们了解到补单可以快速增加产品的销量、评论数量&#xff0c;提升排名&#xff0c;从而打造爆款产品。产品的购买率和评价对于转化率和平台排名至关重要&#xff01; 当排名不断提高&#xff0c;带来的流量也会增加&#xff0…

机器学习和深度学习--李宏毅(笔记与个人理解)Day17

Day 17Convolutional Neyral Network (CNN) 卷积神经网络一般都用在image 上面比较多一些&#xff0c;所以课程的例子大多数也都是image Image Classification the same size how about for pc? 这里对于tensor 张量这个概念&#xff0c;我还是比较奇怪&#xff0c;在我认为一…

java混淆的公司有哪些

一些提供 Java 混淆服务的公司包括&#xff1a; PreEmptive Solutions&#xff1a;PreEmptive Solutions 提供了一系列用于保护 Java 和 .NET 应用程序的工具&#xff0c;包括混淆、代码压缩、加密和漏洞检测等功能。 DexGuard&#xff1a;DexGuard 是 Guardsquare 公司推出的…

ubuntu磁盘文件损坏不能启动的修复方法

目录 1.错误现象2.解决 1.错误现象 今天早上启动虚拟机中的ubuntu发生如下错误,不能正常启动 2.解决 根据上面的提示可以运行以下命令修复: e2fsck /dev/sda1 #根据提示输入y reboot重启后ubuntu系统正常.

HR面试潜台词_弹性工作不强制考勤=做不完就要加班 扁平管理化=没有升职空间 原则上不鼓励加班=

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

【Leetcode每日一题】 递归 - 二叉树的所有路径(难度⭐)(59)

1. 题目解析 题目链接&#xff1a;257. 二叉树的所有路径 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 针对二叉树路径的求解问题&#xff0c;我们可以采用深度优先遍历&#xff08;DFS&#xff09;的策略来寻找所…

【LAMMPS学习】八、基础知识(3.3)使用分布式网格

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

筑牢个人信息安全防线,海云安受邀参加武汉“名家论坛”国家安全教育日专题讲座

近日&#xff0c;武汉“名家论坛”国家安全教育日专题讲座活动《“刷脸”有风险&#xff0c;如何保护我们的个人信息安全&#xff1f;》在武汉图书馆报告厅举办&#xff0c;海云安副总工程师李博士受邀参加本次活动。 活动以线下讲座、线上直播的形式&#xff0c;结合“普法讲座…

【数据结构1-基本概念和术语】

这里写自定义目录标题 0.数据&#xff0c;数据元素&#xff0c;数据项&#xff0c;数据对项&#xff0c;数据结构&#xff0c;逻辑结构&#xff0c;存储结构1.结构1.1逻辑结构1.2存储结构1.2.1 顺序结构1.2.2链式结构 1.3数据结构1.3.1基本数据类型1.3.2抽象数据类型1.3.2.1一个…

算法学习——LeetCode力扣补充篇9(912. 排序数组、21. 合并两个有序链表、33. 搜索旋转排序数组、103. 二叉树的锯齿形层序遍历)

算法学习——LeetCode力扣补充篇9 912. 排序数组 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&…

Qt+vstudio2022的报错信息积累

从今天开始记录一下平常开发工作中的报错记录&#xff0c;后续有错误动态补充&#xff01; 报错信息&#xff1a;【MSB8041】此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 解决&#xff1a; 背景&#xff1a;换…

4个步骤:如何使用 SwiftSoup 和爬虫代理获取网站视频

摘要/导言 在本文中&#xff0c;我们将探讨如何使用 SwiftSoup 库和爬虫代理技术来获取网站上的视频资源。我们将介绍一种简洁、可靠的方法&#xff0c;以及实现这一目标所需的步骤。 背景/引言 随着互联网的迅速发展&#xff0c;爬虫技术在今天的数字世界中扮演着越来越重要…

潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏

游戏名称&#xff1a;潮玩宇宙大逃杀 游戏类型&#xff1a;休闲竞技类小游戏 游戏目标&#xff1a;玩家通过选择房间躲避杀手&#xff0c;生存下来并瓜分被杀房间的元宝。 核心功能 房间选择&#xff1a;玩家进入游戏后&#xff0c;可以选择一间房间躲避杀手。杀手行动&…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…

文件服务: txt文件预览乱码问题

文章目录 一、背景二、解决方案1、转换流&#xff08;解决代码与文件编码不一致读取乱码的问题&#xff09;2、获取文本文件的字符编码 一、背景 在springboot项目中使用springmvc web.resources的形式进行文件访问。本地上传txt文件编码格式为GB2312(中文简体)&#xff0c;浏…

探索数据结构:BF与KMP的灵活应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是字符串匹配算法 字符串匹配是计算机科学中的一个基础概念&…

超高效空气过滤器(ULPA)在半导体制造领域需求旺盛 滤芯为其重要组成部分

超高效空气过滤器&#xff08;ULPA&#xff09;在半导体制造领域需求旺盛 滤芯为其重要组成部分 超高效空气过滤器&#xff08;ULPA&#xff09;又称超低穿透率空气过滤器&#xff0c;指含有超高效过滤网&#xff0c;对0.1微米粒子捕集效率在99.999%以上的空气过滤器。与高效空…

神经网络压缩图像

简介 典型的压缩管道由四个组件组成&#xff1a; 编码&#xff1a;输入图像 x x x通过编码器函数 ε \varepsilon ε&#xff0c;将其转换为潜在表示 z z z。 量化&#xff1a;截断 z z z以丢弃一些不重要的信息 熵编码&#xff1a;使用某种形式的熵编码&#xff08;例如&…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息…

【devops】 阿里云挂载云盘 | 扩展系统硬盘 | 不重启服务器增加硬盘容量

扩容分区和文件系统&#xff08;Linux&#xff09; 文档地址 https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spm5176.smartservice_service_robot_chat_new.help.dexternal.4ac4f625Ol66kL#50541782adxmp…