题目描述
给定一个字符串数组 wordDict
和两个已经存在于该数组中的不同的字符串 word1
和 word2
。返回列表中这两个单词之间的最短距离。
示例 1:
输入: wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "coding", word2 = "practice"
输出: 3
示例 2:
输入: wordsDict = ["practice", "makes", "perfect", "coding", "makes"], word1 = "makes", word2 = "coding"
输出: 1
提示:
1 <= wordsDict.length <= 3 * 104
1 <= wordsDict[i].length <= 10
wordsDict[i]
由小写英文字母组成
word1
和 word2
在 wordsDict
中
word1 != word2
解法
方法一:双指针
遍历数组 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 | class Solution:
def shortestDistance(self, wordsDict: List[str], word1: str, word2: str) -> int:
i = j = -1
ans = inf
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 | class Solution {
public int shortestDistance(String[] wordsDict, String word1, String word2) {
int ans = 0x3f3f3f3f;
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 | class Solution {
public:
int shortestDistance(vector<string>& wordsDict, string word1, string word2) {
int ans = INT_MAX;
for (int k = 0, i = -1, j = -1; k < wordsDict.size(); ++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 | func shortestDistance(wordsDict []string, word1 string, word2 string) int {
ans := 0x3f3f3f3f
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
}
|