持续创作,加速成长!这是我参与「掘金日新计划 · 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
};
复制代码
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~