【C++刷题】力扣-#243-最短单词距离

embedded/2024/10/23 4:46:34/

题目描述

给定一个单词列表 words 和两个单词 word1 和 word2,返回这两个单词在列表中的最短距离。如果 word1 和 word2 是同一个单词,则返回它与自身的最近距离。

示例

示例 1:

输入: words = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "coding"
输出: 1

示例 2:

输入: words = ["practice", "makes", "perfect", "makes"], word1 = "makes", word2 = "makes"
输出: 2

题解

这个问题可以通过遍历数组并跟踪 word1 和 word2 的最近出现位置来解决。

  1. 初始化:创建两个变量 index1 和 index2 来存储 word1 和 word2 的索引,并将它们初始化为 -1。同时,创建一个变量 minDistance 来存储最小距离,并将其初始化为 ∞。
  2. 遍历数组:遍历单词列表 words。
    ○ 如果当前单词等于 word1,则更新 index1 为当前索引,并更新 minDistance 为 index1 和 index2 之间的距离。
    ○ 如果当前单词等于 word2,则更新 index2 为当前索引,并更新 minDistance 为 index1 和 index2 之间的距离。
    ○ 每次更新 minDistance 时,使用 min(minDistance, abs(index1 - index2)) 来确保它是最小的。
  3. 返回结果:遍历结束后,返回 minDistance。

代码实现

int shortestDistance(vector<string>& words, string word1, string word2) {int index1 = -1, index2 = -1;int minDistance = INT_MAX;for (int i = 0; i < words.size(); i++) {if (words[i] == word1) {index1 = i;if (index2 != -1) {minDistance = min(minDistance, abs(index1 - index2));}}if (words[i] == word2) {index2 = i;if (index1 != -1) {minDistance = min(minDistance, abs(index1 - index2));}}}return minDistance;
}

复杂度分析

● 时间复杂度:O(n),其中 n 是单词列表 words 的长度。我们需要遍历一次列表。
● 空间复杂度:O(1),因为我们只使用了常数个额外变量。
这个算法的优势在于它只需要一次遍历即可找到最短单词距离,且不需要额外的存储空间。


http://www.ppmy.cn/embedded/129734.html

相关文章

Java学习Day50:唤醒八戒(Excel相关)

1.批量导入Excel数据 1.实现模板下载 <el-card class"box-card"> <div class"boxMain"> <el-button style"margin-bottom: 20px;margin-right: 20px" type"primary" click"downloadTemplate()">模板下载…

Python知识点:基于Python技术和工具,如何使用IPFS进行去中心化存储

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用IPFS进行去中心化存储 在当今的数字化时代&#xff0c;数据存储的安全和…

vue与u3d互调

vue与u3d互调 u3d配置 给前端发送数据的方法中使用下面的方法给Window注册个事件 // eventname 方法名: 随意取, 前端用这个名判断是获取哪个事件的数据 // data 给vue 传递的参数 window.ReportReady(UTF8ToString(eventname), UTF8ToString(data));vue配置 将u3d导出好…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

MySQL 中的三种引号

一&#xff1a;标识符和字符常量 要理解MySQL中三种引号的作用&#xff0c;首先就需要了解MySQL中标识符、字符串常量表示的是什么。 标识符&#xff1a; 引用数据库对象名称。如&#xff1a;数据库名、表名、存储过程名称、列名。这些都是标识符。 字符串常量&#xff1a; 表…

Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色

推荐:https://github.com/gyf-dev/ImmersionBar 在 Android 中要实现特定 Activity 内容顶部显示在状态栏底部以及封装方法修改状态栏颜色&#xff0c;可以通过以下步骤来完成&#xff1a; 一、让 Activity 内容显示在状态栏底部 在 AndroidManifest.xml 文件中&#xff0c;为特…

#MySQL `SELECT` 语句执行流程详解

在数据库操作中&#xff0c;MySQL 的 SELECT 语句是用于查询数据最常见的 SQL 语句之一。理解它的执行流程对数据库优化和性能提升具有至关重要的意义。本文将详细解析 SELECT 语句从发出请求到返回结果的每个步骤&#xff0c;并结合 MySQL 的架构为您提供深度理解。 ## 1. 连接…

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…