🌈【LeetCode 17.11. 单词距离 】- JavaScript(双指针+hash)

140 阅读2分钟

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


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 17.11. 单词距离 】- JavaScript(双指针+hash)

题目描述

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

示例 1:

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

输出:1

提示:

  • words.length <= 100000

双指针

思路分析:

整体的的思路:我们通过利用双指针的思想 => 没有找齐那就一直更新找到的那个,因为对方肯定在后面,所以要一直更新找到的这个。如果找齐了,每找到一个,就比较一下。具体实现步骤如下:

  • 对words进行从头到尾的遍历。
  • 使用两个指针 p1 和 p2 分别两个字符串的位置,
  • 如果遇到word1 则将 index1 更新为当前下标;
  • 如果遇到word2 则将 index2 更新为当前下标;
  • 如果 index1 和 index2 都非负,则计算两个下标的距离|index1-index2|.并用该距离更新最短距离。
var findClosest = function (words, word1, word2) {
    let res = Number.MAX_VALUE, index1, index2
    for (let i = 0; i < words.length; i++) {
        if (words[i] === word1 || words[i] === word2) {
            if (words[i] === word1) {
                index1 = i
            } else if (words[i] === word2) {
                index2 = i
            }
            if (index1 && index2) {
                res = Math.min(Math.abs(index1 - index2), res)
                if (res === 0) return 0
            }
        }
    }
    return res
};

哈希表

思路:在双指针的思路上,可以使用哈希表记录每个单词出现位置并缓存,这样每次找时都无需再遍历数组,直接可以进行计算。通过利用hash来提高效率。具体步骤如下:

  • 初始化哈希表,将各个单词索引以链表形式存储在哈希表中
  • 根据目标单词取出索引列表即可
  • 在进行比较找出最小索引差值
var findClosest = function(words, word1, word2) {
    let res = 0;
    let c = new Map();
    for (let i = 0; i < words.length; i++) {
        let temp = words[i]; 
        if (temp === word1 || temp === word2) {
            c.set(temp, i)
        }
        if (c.size === 2) {
            let value = Math.abs(c.get(word2) - c.get(word1))
            if (res === 0) {
                res = value
            } else {
                res = Math.min(res, value)
            }
        }
    }
    return res
};

思考

本题中使用hash的目的就是减少重复访问时做了缓存,不再需要遍历数组,在时间复杂度上优化明显。👀🤞


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤