一、题目描述:
有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例:
输入: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。
作者:ClyingDeng
链接:https://juejin.cn/post/6939083966087430174
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。