leetcode
leetcode 201 ~ 250
最短单词距离 III

最短单词距离 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相同的情况时,代码如何确保还能正确计算最短距离,尤其是当相同单词连续出现时?
在代码中,如果word1和word2相同,会特别处理这种情况。当遇到与word1相同的单词时,会更新index1的值,并且使用last_word变量检查前一个单词是否也是word1。如果是,这意味着相同的单词连续出现,此时会计算两次出现之间的距离,并更新最小距离dist。这种方法确保了即使word1和word2相同,代码也能正确处理连续出现的情况,实时更新最短距离。
🦆
代码中使用了`last_word`变量来记录上一个单词,这种方法在哪些情况下可能会导致误判或错误的距离计算?
在此代码实现中,`last_word`用于记录当前单词的前一个单词,主要用于判断两个连续单词是否是我们要比较的两个单词。这种方法可能导致误判的情况出现在:如果单词列表中存在多个连续的word1(或word2),而word1和word2是相同的,此时last_word会被连续更新为相同的值,导致无法适当地更新dist。例如,如果word1和word2相同,且连续出现多次,last_word会连续记录相同值,可能在某些情况下不正确地更新距离。
🦆
为什么选择将最小距离`dist`初始化为`len(words)+1`,而不是其他任意大的数或者使用无穷大表示?
将最小距离`dist`初始化为`len(words)+1`是因为在单词列表中,两个单词的最大可能距离就是列表的长度(例如,一个单词在列表的开始,另一个在结束),因此初始化为列表长度加一是确保在开始比较之前,任何有效的距离都会小于这个初始值,从而获得正确的最小距离。此外,使用`len(words)+1`避免了引入特殊库或复杂的数据类型,如无限大(infinity),使得代码更简单、更容易理解。
🦆
你的算法在遍历单词列表时使用了`if`和`elif`结构来区分`word1`和`word2`,如果`word1`和`word2`是相同的单词,这种结构是否会影响算法的效率或正确性?
当`word1`和`word2`是相同的单词时,算法的逻辑确保只有一个分支(`if`块)会被执行,此时`elif`块将不会执行。虽然这不会影响算法的正确性,因为适当的处理逻辑已经包含在`if`块中,但可能对效率有轻微影响。特别是在word1和word2相同且连续出现的情况下,每次遇到相同单词都需要进行比较和更新操作,这可能稍微增加执行时间。然而,这种影响通常是微小的,因为额外的处理仍然是必要的,以确保在相同单词连续出现时能够正确地计算最短距离。

相关问题

最短单词距离

最短单词距离

最短单词距离 II

最短单词距离 II