题目描述
给定一个字符串数组 wordsDict
和两个字符串 word1
和 word2
,返回这两个单词在列表中出现的最短距离。
注意:word1
和 word2
是有可能相同的,并且它们将分别表示为列表中 两个独立的单词 。
示例 1:
输入:wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "coding"
输出:1
示例 2:
输入:wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "makes"
输出:3
提示:
1 <= wordsDict.length <= 105
1 <= wordsDict[i].length <= 10
wordsDict[i]
由小写英文字母组成
word1
和 word2
都在 wordsDict
中
解法
方法一:分情况讨论
先判断 word1
和 word2
是否相等:
如果相等,遍历数组 wordsDict
,找到两个 word1
的下标 $i$ 和 $j$,求 $i-j$ 的最小值。
如果不相等,遍历数组 wordsDict
,找到 word1
和 word2
的下标 $i$ 和 $j$,求 $i-j$ 的最小值。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 wordsDict
的长度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | class Solution:
def shortestWordDistance(self, wordsDict: List[str], word1: str, word2: str) -> int:
ans = len(wordsDict)
if word1 == word2:
j = -1
for i, w in enumerate(wordsDict):
if w == word1:
if j != -1:
ans = min(ans, i - j)
j = i
else:
i = j = -1
for k, w in enumerate(wordsDict):
if w == word1:
i = k
if w == word2:
j = k
if i != -1 and j != -1:
ans = min(ans, abs(i - j))
return ans
|
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
28 | class Solution {
public int shortestWordDistance(String[] wordsDict, String word1, String word2) {
int ans = wordsDict.length;
if (word1.equals(word2)) {
for (int i = 0, j = -1; i < wordsDict.length; ++i) {
if (wordsDict[i].equals(word1)) {
if (j != -1) {
ans = Math.min(ans, i - j);
}
j = i;
}
}
} else {
for (int k = 0, i = -1, j = -1; k < wordsDict.length; ++k) {
if (wordsDict[k].equals(word1)) {
i = k;
}
if (wordsDict[k].equals(word2)) {
j = k;
}
if (i != -1 && j != -1) {
ans = Math.min(ans, Math.abs(i - j));
}
}
}
return ans;
}
}
|
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
28
29
30 | class Solution {
public:
int shortestWordDistance(vector<string>& wordsDict, string word1, string word2) {
int n = wordsDict.size();
int ans = n;
if (word1 == word2) {
for (int i = 0, j = -1; i < n; ++i) {
if (wordsDict[i] == word1) {
if (j != -1) {
ans = min(ans, i - j);
}
j = i;
}
}
} else {
for (int k = 0, i = -1, j = -1; k < n; ++k) {
if (wordsDict[k] == word1) {
i = k;
}
if (wordsDict[k] == word2) {
j = k;
}
if (i != -1 && j != -1) {
ans = min(ans, abs(i - j));
}
}
}
return ans;
}
};
|
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
28
29
30
31
32
33
34
35 | func shortestWordDistance(wordsDict []string, word1 string, word2 string) int {
ans := len(wordsDict)
if word1 == word2 {
j := -1
for i, w := range wordsDict {
if w == word1 {
if j != -1 {
ans = min(ans, i-j)
}
j = i
}
}
} else {
i, j := -1, -1
for k, w := range wordsDict {
if w == word1 {
i = k
}
if w == word2 {
j = k
}
if i != -1 && j != -1 {
ans = min(ans, abs(i-j))
}
}
}
return ans
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
|