最短单词距离 II
难度:
标签:
题目描述
代码结果
运行时间: 39 ms, 内存: 23.8 MB
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 设计一个类,该类包含以下两个函数:
* 1. WordDistance(String[] words) 初始化对象,传入单词列表。
* 2. int shortest(String word1, String word2) 返回两个单词之间的最短距离。
*/
public class WordDistance {
private Map<String, List<Integer>> wordIndices;
/**
* 初始化对象,存储每个单词的所有出现位置
*/
public WordDistance(String[] words) {
wordIndices = new HashMap<>();
for (int i = 0; i < words.length; i++) {
wordIndices.computeIfAbsent(words[i], k -> new ArrayList<>()).add(i);
}
}
/**
* 返回两个单词之间的最短距离
*/
public int shortest(String word1, String word2) {
List<Integer> indices1 = wordIndices.get(word1);
List<Integer> indices2 = wordIndices.get(word2);
return indices1.stream()
.flatMapToInt(index1 -> indices2.stream().mapToInt(index2 -> Math.abs(index1 - index2)))
.min()
.orElse(Integer.MAX_VALUE);
}
}
解释
方法:
该题解采用了预处理+双指针的思路。在初始化时,先用哈希表 wordIdx 将单词映射到对应的序号,然后用列表 idxs 存储每个单词在原数组中出现的所有下标。在计算最短距离时,对于给定的两个单词 word1 和 word2,分别取出它们在 idxs 中存储的下标列表 idxs1 和 idxs2,然后用双指针 i 和 j 同时遍历这两个列表,更新最短距离 ans。
时间复杂度:
O(n+m1+m2)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在计算最短单词距离时选择使用双指针方法而不是其他可能的算法?
▷🦆
在双指针遍历中,当`idxs2[j] < idxs1[i]`时,为什么选择仅增加j的值而不是同时比较增加i的情况是否能得到更小的距离?
▷🦆
当一个单词比另一个单词出现次数多很多时,这种双指针遍历是否还是效率最高的方法?
▷🦆
在初始化哈希表`wordIdx`时,为什么选择`DefaultDict(int)`而不是普通的字典?
▷