Shortest Word Distance II

这道题一开始想通过init函数写一个O(n^2)的算法把所有工作一劳永逸的搞定,然后shortest就是O(1)的时间复杂度了,但是大case过不了,所以这里只能通过两个O(n)的算法(shortest函数无法界定,非要说的话就是O(j+k),j和k都是两个词在words列表里面出现的次数)解决问题了

class WordDistance(object):

    def __init__(self, words):
        """
        :type words: List[str]
        """
        self.store = {}
        for index, word in enumerate(words):
            self.store.setdefault(word, [])
            self.store[word].append(index)

    def shortest(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        result = sys.maxint
        for index1 in self.store[word1]:
            for index2 in self.store[word2]:
                result = min(abs(index1 - index2), result)

        return result

这就是最优了?并不是,shortest函数我们还可以把两个循环放在一起,利用第一题的翻滚向前的思路来写,这样时间复杂度从O(j + k)变成了O(min(j, k)),上升不多,但是因为极端case的存在,这样的逻辑表现肯定更好

class WordDistance(object):

    def __init__(self, words):
        """
        :type words: List[str]
        """
        self.store = {}
        for index, word in enumerate(words):
            self.store.setdefault(word, [])
            self.store[word].append(index)

    def shortest(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        result = sys.maxint
        n, m = len(self.store[word1]), len(self.store[word2])
        i, j = 0, 0
        while i < n and j < m:
            result = min(abs(self.store[word1][i] - self.store[word2][j]), result)
            if self.store[word1][i] < self.store[word2][j]:
                i += 1
            else:
                j += 1

        return result

results matching ""

    No results matching ""