持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【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的目的就是减少重复访问时做了缓存,不再需要遍历数组,在时间复杂度上优化明显。👀🤞
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤