Leetcode 面试题 17.11. 单词距离(medium)

目录

1. 问题描述

2. 思路与算法1

3. 思路与算法2

4. 延申


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之间的距离并求其最小值。假定有n1个word1,有n2个word2,则需要计算n_1\cdot n_2个距离。

        考虑算法如下:

        首先遍历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出现的索引为i_1,i_2,...,word2出现的索引为j_1,j_2,...,对于每个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每日一题总目录(动态更新。。。)

猜你喜欢

转载自blog.csdn.net/chenxy_bwave/article/details/124996392