Shortest Word Distance

Given a list of words and two wordsword1andword2, return the shortest distance between these two words in the list.

For example, Assume that words =["practice", "makes", "perfect", "coding", "makes"].

Givenword1=“coding”,word2=“practice”, return 3. Givenword1="makes",word2="coding", return 1.

Note: You may assume that word1 does not equal to word2, and word1 and word2 are both in the list.

1. 遍历一遍数组,直接把两个给定单词所有出现的位置分别存到两个数组里,然后对两个数组进行两两比较更新结果

class Solution(object):
    def shortestDistance(self, words, word1, word2):
        """
        :type words: List[str]
        :type word1: str
        :type word2: str
        :rtype: int
        """
        list1 = []
        list2 = []
        result = 2 * len(words)
        for i in xrange(len(words)):
            if words[i] == word1:
                list1.append(i)
            elif words[i] == word2:
                list2.append(i)
        for i in list1:
            for j in list2:
                result = min(result, abs(i-j))
        return result

简化

 class Solution(object):
    def shortestDistance(self, words, word1, word2):
       list1 = [i for i in xrange(len(words)) if words[i] == word1]
       list2 = [i for i in xrange(len(words)) if words[i] == word2]
       return min([abs(i - j) for i in list1 for j in list2])

2. 用两个变量p1,p2初始化为一个大数(float('inf')),然后我们遍历数组,遇到单词1,就将其位置存在p1里,若遇到单词2,就将其位置存在p2里,更新结果。因为两个单词如果比较接近的话,肯定是相邻的word1和word2的位置之差,所以我们只要每次得到一个新位置和另一个单词的位置比较一下就行了

class Solution(object):
    def shortestDistance(self, words, word1, word2):        
        p1 = float('inf')
        p2 = float('inf')
        result = float('inf')
        for i in xrange(len(words)):
            if words[i] == word1:
                p1 = i
            elif words[i] == word2:
                p2 = i
            result = min(result, abs(p1-p2))
        return result

Last updated

Was this helpful?