我也想刷穿 LeetCode啊】面试题 17.11. 单词距离

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

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

示例:

输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1
复制代码

提示:

words.length <= 100000

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

二、思路分析

  • 先将两个单词出现的索引取出,分别放在两个数组中
  • 双指针遍历,不断更新最小距离
  • 若最小距离出现了0,则直接返回

三、代码实现

const findClosest = (words, word1, word2) => {
    // 存放两个单词的索引
    const index1 = [];
    const index2 = [];
    const len = words.length;
    for (let i = 0; i < len; i++) {
        if (words[i] === word1) {
            index1.push(i);
        }
        if (words[i] === word2) {
            index2.push(i);
        }
    }
    // 双指针遍历
    let min = Infinity;
    let [i, j] = [0, 0];
    while (i < index1.length && j < index2.length) {
        // 更新最小值
        min = Math.min(min, Math.abs(index1[i] - index2[j]));
        // 若最小值为0,则直接返回
        if (min === 0) return min;
        if (index1[i] > index2[j]) {
            j++;
        } else {
            i++;
        }
    }
    return min;
};



复制代码

或者遍历整个 words 数组,判断如果单词是 word1 或者 word2 时,记录一下它的数组下标,并用它减去上一次出现的另一个 word 的下标。

代码如下:

/**
 * @param {string[]} words
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var findClosest = function(words, word1, word2) {
    let prevIndexOf = -1
    let preIndex = 0
    let ans = Infinity
    for (let i = 0; i < words.length; i ++) {
        const w = words[i]
        const indexOf = [word1, word2].indexOf(w)
        if (indexOf !== -1) {
            if (prevIndexOf !== -1 && prevIndexOf !== indexOf) {
                ans = Math.min(ans, i - preIndex)
            }
            prevIndexOf = indexOf
            preIndex = i
        }
    }
    return ans
};


复制代码

四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~

猜你喜欢

转载自juejin.im/post/7110551594868932639