最短单词距离 III
难度:
标签:
题目描述
代码结果
运行时间: 68 ms, 内存: 0.0 MB
/*
* 思路:
* 使用Java Stream API处理相同的逻辑。
* 我们可以首先将单词和索引对映射为一个列表,然后进行过滤和处理以找到最短距离。
*/
import java.util.*;
import java.util.stream.*;
public class SolutionStream {
public int shortestWordDistance(String[] words, String word1, String word2) {
List<int[]> wordPositions = IntStream.range(0, words.length)
.filter(i -> words[i].equals(word1) || words[i].equals(word2))
.mapToObj(i -> new int[]{i, words[i].equals(word1) ? 1 : 2})
.collect(Collectors.toList());
int minDistance = Integer.MAX_VALUE;
for (int i = 0; i < wordPositions.size(); i++) {
for (int j = i + 1; j < wordPositions.size(); j++) {
if (wordPositions.get(i)[1] != wordPositions.get(j)[1] || word1.equals(word2)) {
minDistance = Math.min(minDistance, Math.abs(wordPositions.get(i)[0] - wordPositions.get(j)[0]));
if (minDistance == 1) return minDistance; // 最短距离为1,直接返回
}
}
}
return minDistance;
}
}
解释
方法:
这个题解的思路是用两个指针index1和index2分别记录word1和word2最后出现的位置。遍历单词列表words,如果当前单词等于word1或word2,就更新对应指针,并计算当前位置与另一个单词最后出现位置的距离,更新最小距离dist。注意处理word1和word2相同的情况,若当前word等于word1且上一个词last_word等于word2,或者当前word等于word2且上一个词等于word1,都要更新最小距离。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在处理word1和word2相同的情况时,代码如何确保还能正确计算最短距离,尤其是当相同单词连续出现时?
▷🦆
代码中使用了`last_word`变量来记录上一个单词,这种方法在哪些情况下可能会导致误判或错误的距离计算?
▷🦆
为什么选择将最小距离`dist`初始化为`len(words)+1`,而不是其他任意大的数或者使用无穷大表示?
▷🦆
你的算法在遍历单词列表时使用了`if`和`elif`结构来区分`word1`和`word2`,如果`word1`和`word2`是相同的单词,这种结构是否会影响算法的效率或正确性?
▷