leetcode解题: Shortest Word Distance (243)

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

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

Given word1 = “coding”, word2 = “practice”, return 3.
Given word1 = “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:

思路就是维护两个指针,一个记录上一次出现的word1的位置,另一个记录word2的位置。每次发现一个新位置的时候计算一下当前的距离并且更新最短距离。
C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
int shortestDistance(vector<string>& words, string word1, string word2) {
int iter1 = -1, iter2 = -1;
int res = words.size();
for (int i = 0; i < words.size(); i++) {
if (words[i] == word1) {
iter1 = i;
if (iter2 != -1) {
res = std::min(res, iter1 - iter2);
}
} else if (words[i] == word2) {
iter2 = i;
if (iter1 != -1) {
res = std::min(res, iter2 - iter1);
}
}
}
return res;
}
};

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Solution {
public int shortestDistance(String[] words, String word1, String word2) {
if (words.length < 2) {
return 0;
}
int first = -1, second = -1;
int res = Integer.MAX_VALUE;
for (int i = 0; i < words.length; i++) {
if (words[i].equals(word1)) {
first = i;
if (second != -1) {
res = Math.min(res, Math.abs(second - first));
}
} else if (words[i].equals(word2)) {
second = i;
if (first != -1) {
res = Math.min(res, Math.abs(second - first));
}
}
}
return res;
}
}