题号:no94
题目名:单词距离
原题URL:https://leetcode-cn.com/problems/string-rotation-lcci/
题目描述
有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
示例
示例 1:
输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1
限制
words.length <= 100000
思路
1.将两个单词的索引全部存起来
2.之后就变成了求两个数组中的最小差的问题
3.排序两个集合,用双指针,如果diff小于0,说明被减数太小,需要往后移动指针,否则就是减得那个数往后移动指针
解题代码
class Solution {
public int findClosest(String[] words, String word1, String word2) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
for (int i = 0; i < words.length; i++) {
if(word1.equals(words[i])) {
list1.add(i);
}
if(word2.equals(words[i])) {
list2.add(i);
}
}
//求两个集合的最小差
list1.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
list2.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
//索引
int idx1 = 0;
int idx2 = 0;
int min = Integer.MAX_VALUE;
while (idx1<list1.size()&&idx2<list2.size()) {
int diff = list1.get(idx1)-list2.get(idx2);
min = Math.min(min,Math.abs(diff));
if(diff<0) {
idx1++;
}else {
idx2++;
}
}
return min;
}
}