有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例:
输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1
提示:
words.length <= 100000
方法1:哈希
public int findClosest(String[] words, String word1, String word2) {
HashMap<String, List<Integer>> map = new HashMap<>();
for (int i = 0; i < words.length; i++) {
String cur = words[i];
map.putIfAbsent(cur, new ArrayList<>());
map.get(cur).add(i);
}
List<Integer> list1 = map.get(word1);
List<Integer> list2 = map.get(word2);
int dist = Integer.MAX_VALUE / 2;
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
dist = Math.min(dist, Math.abs(list1.get(i) - list2.get(j)));
}
}
return dist;
}
方法2:一次遍历
public int findClosest(String[] words, String word1, String word2) {
boolean f1 = false, f2 = false;
int i1 = 0, i2 = 0;
int dist = Integer.MAX_VALUE / 2;
for (int i = 0; i < words.length; i++) {
String cur = words[i];
if (cur.equals(word1)) {
i1 = i;
f1 = true;
} else if (cur.equals(word2)) {
i2 = i;
f2 = true;
}
if (f1 && f2) {
dist = Math.min(dist, Math.abs(i1 - i2));
}
}
return dist;
}