Assume that words = ["practice", "makes", "perfect", "coding", "makes"].
Given word1 = “makes”, word2 = “coding”, return 1.
Given word1 = "makes", word2 = "makes", return 3.
class Solution {
public int shortestWordDistance(String[] words, String word1, String word2) {
if (word1.equals(word2)) {
int ret = Integer.MAX_VALUE, lastIdx = -1;
for (int i = 0; i < words.length; ++i) {
if (words[i].equals(word1)) {
if (lastIdx != -1) ret = Math.min(i - lastIdx, ret);
lastIdx = i;
}
}
return ret;
}
// 如果不相等,和之前那道一样
List<Integer> idx1 = new ArrayList<>();
List<Integer> idx2 = new ArrayList<>();
for (int i = 0; i < words.length; ++i) {
if (words[i].equals(word1)) idx1.add(i);
else if (words[i].equals(word2)) idx2.add(i);
}
int i = 0, j = 0, ret = Integer.MAX_VALUE;
while (i < idx1.size() && j < idx2.size()) {
int diff = idx1.get(i) - idx2.get(j);
ret = Math.min(ret, Math.abs(diff));
if (diff > 0) j++;
else i++;
}
return ret;
}
}
class Solution:
def shortestWordDistance(self, words, word1, word2):
"""
:type words: List[str]
:type word1: str
:type word2: str
:rtype: int
"""
def sameWordsCase():
minDiff = float('inf')
lastIdx = None
for i in range(len(words)):
if words[i] == word1:
if lastIdx is None:
lastIdx = i
else:
minDiff = min(minDiff, abs(i - lastIdx))
lastIdx = i
return minDiff
def differentWordsCase():
lst1 = []
lst2 = []
for i in range(len(words)):
if words[i] == word1:
lst1.append(i)
elif words[i] == word2:
lst2.append(i)
# find min diff in two sorted arrays
i, j = 0, 0
minDiff = float('inf')
while i < len(lst1) and j < len(lst2):
diff = lst1[i] - lst2[j]
minDiff = min(minDiff, abs(diff))
if diff > 0: j += 1
else: i += 1
return minDiff
# Main Part
if word1 == word2: return sameWordsCase()
else: return differentWordsCase()