一、题目描述:
有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例:
输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1
提示:
- words.length <= 100000
二、思路分析:
思路一:
暴力破解:
记录返回的初始值temp为words数组长度。第一次循环words,第一次出现word1的时侯,再循环一次words,找到word2出现的下标。此时word1和word2差值的绝对值与temp相比,去最小值。
外循环中,如果不止一次出现word1,就会依次循环比较,在内循环中更新temp的最小值。
思路二:
使用一次循环。
定义temp为返回值words.length,w1为word1出现的下标,w2为word2出现的下标。
在循环中,可以记录两个word出现的下标,如果两个都不等于零,则说明已经获取到两个word的最初下标。word1和word2差值的绝对值与temp相比,取小值。
此时还会碰到一种情况,word1或word2只出现在数组的最前面,那么直接将temp取两数下标之差的绝对值。
三、AC 代码:
方法一:
function findClosest(words: string[], word1: string, word2: string): number {
let temp = words.length;
for (let i = 0; i < words.length; i++) {
if (words[i] === word1) {
for (let j = 0; j < words.length; j++) {
if (words[j] === word2) {
temp = Math.min(Math.abs(i - j), temp);
}
}
}
}
return temp;
};
方法二:
function findClosest(words: string[], word1: string, word2: string): number {
let temp = words.length;
let w1;
let w2;
for (let i = 0; i < words.length; i++) {
if (words[i] === word1) w1 = i;
if (words[i] === word2) w2 = i;
if (w1 > 0 && w2 > 0)
temp = Math.min(Math.abs(w2 - w1), temp);
}
if(w1 === 0|| w2 === 0) temp = Math.abs(w2 - w1);
return temp;
};
四、总结:
第一种暴力破解应该没什么难的,主要是使用单循环时会遗漏其他情况。
题目来源:leetcode。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情。