[100天算法】-面试题 17.11.单词距离(day 68)

news2024/11/26 14:48:19

题目描述

有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?

示例:

输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1
提示:

words.length <= 100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-closest-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法 1:双指针

思路

使用双指针去找目标词:

  • 当 指针l 找到 word1 时,指针r 从 指针l 的右边出发去找 word1 或者 word2
  • 如果 指针r 找到了 word2,计算距离 r - l,同时记录一个最小的距离;
  • 如果 指针r 找到的还是 word1,更新 指针l 到 指针r 的位置,指针r 继续右移寻找;

复杂度分析

  • 时间复杂度:$O(N)$,N 为数组长度。
  • 空间复杂度:$O(1)$。

代码

JavaScript Code

/**
 * @param {string[]} words
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var findClosest = function (words, word1, word2) {
    const len = words.length;

    // 找到 word1 或者 word2
    const foundTarget = word => [word1, word2].includes(word);

    // e.g. 如果当前是 word1,那下一个要找的是 word2
    const getNext = cur => (cur === word1 ? word2 : word1);

    let res = len;
    let l = -1,
        r = -1,
        next = ''; // 下一个目标词

    while (r < len) {
        // 找到 word1 或者 word2
        if (foundTarget(words[r])) {
            // 如果找到的是目标词就更新 res
            if (words[r] === next && r - l < res) res = r - l;

            // 获取下一个目标词
            next = getNext(words[r]);

            l = r;
            r = r + 1;
        } else {
            r++;
        }
    }
    return res;
};

方法 2:哈希表

思路

先用一个哈希表把每个词出现的位置坐标收集起来,再用两个指针分别遍历两个目标词的坐标数组,计算最短距离。

如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,哈希表的解法更适合。

ps. 下图中 a 和 student 的坐标数组不是题目中的真实结果。

复杂度分析

  • 时间复杂度:$O(N)$,N 为数组长度,遍历一次数组记录单词出现位置的时间复杂度 O(N),遍历两个目标单词的位置数组时间复杂度为 O(N)。
  • 空间复杂度:$O(N)$,N 为数组长度,用了一个哈希表来记录每个单词出现的所有位置。

代码

JavaScript Code

/**
 * @param {string[]} words
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var findClosest = function (words, word1, word2) {
    // 记录所有单词出现的位置
    const dict = {};
    words.forEach((w, i) => {
        dict[w] || (dict[w] = []);
        dict[w].push(i);
    });

    const indices1 = dict[word1],
        indices2 = dict[word2];
    let p1 = 0,
        p2 = 0,
        res = words.length;

    while (p1 < indices1.length && p2 < indices2.length) {
        res = Math.min(Math.abs(indices2[p2] - indices1[p1]), res);
        indices2[p2] > indices1[p1] ? p1++ : p2++;
    }
    return res;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190731.html

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

相关文章

华为Auth-Http Serve任意文件读取

1.漏洞描述 华为Auth-Http Server 1.0任意文件读取&#xff0c;攻击者可通过该漏洞读取任意文件。 2.网络资产查找 FOFA&#xff1a;server”Huawei Auth-Http Server 1.0” 2、部分界面如下 3、Poc /umweb/shadow 4、Poc批量验证 id: huanwei-auth-http-server-filereadi…

商业模式思维导图

一、什么是商业模式&#xff1f;简单的说&#xff0c;商业模式就是公司通过什么途径或方式来赚钱&#xff1f; 商业模式的核心是 创造价值-获取价值-传递价值。 它有3个重要的环节&#xff0c;创造价值是基于客户需求&#xff0c;提供解决方案&#xff0c;传递价值是通过资源配…

5个写自定义函数小练习

计算列表平均值、素数判定、反转字符串&#xff0c;查找整数列表最大最小值、统计字符串中元音字母个数(大小写字不敏感)。 (笔记模板由python脚本于2023年11月09日 21:50:35创建&#xff0c;本篇笔记适合熟悉Python函数及基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】…

Python克隆单个网页

网上所有代码都无法完全克隆单个网页&#xff0c;不是Css&#xff0c;Js下载不下来就是下载下来也不能正常显示&#xff0c;只能自己写了&#xff0c;记得点赞~ 效果如图&#xff1a; 源码与所需的依赖&#xff1a; pip install requests pip install requests beautifulsoup4…

ThreadLocal原理以及内存泄露问题

1、ThreadLocal实现原理 1、每个线程中有一个ThreadLocalsMap&#xff0c;这是一个哈希表的结构里面有很多entry(也就是k-v)&#xff0c;当我们使用ThreadLocal进行set值的时候,会将这个threadLocal设置为key,然后值设置为value放入ThreadLocalsMap&#xff0c;key为弱引用&am…

Vue计算属性 computed

计算属性&#xff1a;常用于逻辑比较复杂的计算&#xff0c;根据已有的数据&#xff0c;计算出一个新的数据。计算属性具有缓存机制&#xff0c;复用性强&#xff0c;效率更高。 计算属性【简写方式】&#xff1a; <template><div>提现金额&#xff1a;<input …

qt-C++笔记之Qt中的时间与定时器

qt-C笔记之Qt中的时间与定时器 code review! 文章目录 qt-C笔记之Qt中的时间与定时器一.Qt中的日期时间数据1.1.QTime&#xff1a;获取当前时间1.2.QDate&#xff1a;获取当前日期1.3.QDateTime&#xff1a;获取当前日期和时间1.4.QTime类详解1.5.QDate类详解1.6..QDateTime类…

ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端系统测试安装教程

播资源提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;…

不定积分第一类换元法(凑微分法)

将其中的 分解为 相当于 令 那么. 就可以得到 例题1 令 那么 因为 所以 利用基本积分公式 结果 例题2 上下同除 接下来需要一些技巧 这个形式需要联想到一个基本积分公式 不巧是这里是2不是1需要利用技巧把2变成1

GDPU 数据结构 天码行空9

实验九 哈夫曼编码 一、【实验目的】 1、理解哈夫曼树的基本概念 2、掌握哈夫曼树的构造及数据结构设计 3、掌握哈夫曼编码问题设计和实现 二、【实验内容】 1、假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成&#xff0c;它们在电文中出现的概率分别为{ 0.…

拍摄视频的时候相机断电导致视频文件损坏,怎么修复

3-4 现在好多人都有自己的相机&#xff0c;但是专业用来录像的机器应该是不太可能都有的&#xff0c;相机的稳定性会比专业的机器差一些&#xff0c;如果用于比较重要的场景&#xff0c;比如婚庆、会议录像、家庭录像使用等&#xff0c;有较少的概率会出现一些奇怪的情况&…

mysql千万数据快速插入-实战

文章目录 前言环境一、配置二、效果总结 前言 数据量太大了&#xff0c;每天半夜要同步很大数据到 mysql 数据库&#xff0c;其中一张表就上2千万&#xff0c;总计上亿条数据。同步任务每天0点之后开始任务&#xff08;因为到0之后才能统计前一天数据&#xff09;&#xff0c;…

Matlab设置figure中标题/图例英文不同字体

1.创建一个曲线图 x linspace(-10,10,200); y sin(4*x)./exp(x); plot(x,y) xlim([0 10]) ylim([-0.4 0.8]) xlabel(a); ylabel(b); title(曲线图sapi); set(gca,FontName,Times New Roman,fontsize,16); legend(曲线12)标题中既包含英文又包含中文&#xff0c;如果设置字体…

selenium xpath定位

selenium-xpath定位 <span style"background-color:#2d2d2d"><span style"color:#cccccc"><code class"language-javascript">element_xpath <span style"color:#67cdcc"></span> driver<span styl…

java中的对象克隆(浅克隆和深克隆)

在实际项目中&#xff0c;一个模型类需要为不同的层提供不同的模型。VO DO DTO 需要将一个对象中的数据克隆到其他对象中。 误区&#xff1a;这种形式的代码复制的是引用&#xff0c;即对象在内存中的地址&#xff0c;stu1和stu2两个引用指向的是同一个对象 Student stu1 new…

【c++】——类和对象(中)——赋值运算符重载

作者:chlorine 专栏:c专栏 你站在原地不动,就永远都是观众。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载的初步认识 &#x1f308;运算符重载 &#x1f308;赋值运算符重载格式 (上) &#x1f308;operator__判断俩个日期是否相等 &#x…

万宾科技智能井盖,实现对井盖的监测

随着人工智能和物联网技术的不断变化&#xff0c;各种适用于市政府提高管理能力和公共服务水平的高科技产品不断更新。在道路基础设施建设过程中&#xff0c;智能井盖传感器的出现时刻保护着城市地下生命线&#xff0c;而且可以对地下水道井盖进行实时的监测并完成数据上传等工…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者&#xff1a;Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability&#xff08;技术预览版&#xff09;、Universal ProfilingTM 和 Elastic APM 集成&#xff0c;以及针对 Elastic Observability 的新 SLO &#…

判断sparse matrix是否是对称矩阵

参考&#xff1a; https://stackoverflow.com/questions/48798893/error-in-checking-symmetric-sparse-matrix import scipy.sparse as sp import numpy as np np.random.seed(1)a sp.random(5, 5, density0.5)a结果如下 sym_err a - a.T sym_check_res np.all(np.abs(s…

docker influxdb

docker & influxdb 搜索镜像 docker search influxdb docker pull influxdb: 1.4.2 docker run -d -p 8086:8086 --name influxdb influxdb:1.4.2 docker exec -it influxdb bash 连接influxdb 控制台 influx -host localhost -port 8086 influx -username root -passw…