目录
1. 问题描述
有个内含单词的超大文本文件,给定任意两个不同的
单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例:
输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student" 输出:1
提示:
words.length <= 100000
2. 思路与算法1
由于是要找最小距离,意味着word1和word2在原word中会多次重复出现,因此两个单词之间的距离理论上来说要计算每对word1和word2之间的距离并求其最小值。假定有个word1,有
个word2,则需要计算
个距离。
考虑算法如下:
首先遍历word,将word1和word2的索引各自存放成一张表。
遍历两张表,从两张表中计算每队元素之间的距离并求其最小值。
得到代码如下:
class Solution:
def findClosest(self, words: List[str], word1: str, word2: str) -> int:
h1 = set()
h2 = set()
for k,word in enumerate(words):
if word==word1:
h1.add(k)
if word==word2:
h2.add(k)
dmin = len(words)
for i in h1:
for j in h2:
dmin = min(dmin,abs(i-j))
return dmin
3. 思路与算法2
事实上,由于是求最小距离,应该是不需要计算每对索引之间的距离。
假定word1出现的索引为,word2出现的索引为
,对于每个word2,只要计算在它前面一个word1和它后面一个word1的距离即可求得与它相关联的与word1的最小距离。
据此可以在一次遍历中完成搜索及最短距离。
从左到右遍历,用last1表示最近一个word1的索引,用last2表示最近一个word2的索引。
每次在状态s1和s2之间切换时,计算当前找到的word与上一个word之间的距离,并更新最小距离即可。
class Solution:
def findClosest(self, words: List[str], word1: str, word2: str) -> int:
state,last1,last2 = 0,0,0
dmin = len(words)
for k,word in enumerate(words):
if state==0:
if word==word1:
state,last1 = 1,k
elif word==word2:
state,last2 = 2,k
elif state==1:
if word==word1:
state,last1 = 1,k
elif word==word2:
state,last2 = 2,k
dmin = min(dmin,abs(last2-last1))
else:
if word==word1:
state,last1 = 1,k
dmin = min(dmin,abs(last2-last1))
elif word==word2:
state,last2 = 2,k
return dmin
执行用时:92 ms, 在所有 Python3 提交中击败了68.50%的用户
内存消耗:31 MB, 在所有 Python3 提交中击败了23.23%的用户
4. 延申
如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
用以上方法就相当于是把每次查询都独立看待,这样重复多次就是单纯的重复多次。所谓优化应该是指后续查询能够利用前面查询所获得的信息,这样使得平均均摊下来的查询时间最小化。
可以考虑像思路与算法1那样,首先对words1进行一次遍历,建立一个哈希表,存储每个word的索引信息。然后每次查询时从哈希表中取出两个word的各自的索引表,根据这两个表来计算最短距离。
回到总目录:Leetcode每日一题总目录(动态更新。。。)