解法一
题中说明需要多次查询,但实际题目中并没有体现出来。用双指针一遍遍历在本题中是快速的方法,但是我认为这不符合原意。
用Map存储单词出现的下标序列,然后双指针找最小差值。其实两个下标序列都是有序的,找最小差值的时候可以使用二分查找进一步优化。
import java.util.*;class Solution {public int findClosest(String[] words, String word1, String word2) {// 存储每个单词的位置序列Map<String, List<Integer>> wordIndexMap = new HashMap<>();int i = 0;for (i = 0; i < words.length; ++i) {if (wordIndexMap.containsKey(words[i])) {wordIndexMap.get(words[i]).add(i);} else {LinkedList<Integer> list = new LinkedList<>();list.add(i);wordIndexMap.put(words[i], list);}}List<Integer> indexList_1 = wordIndexMap.get(word1);List<Integer> indexList_2 = wordIndexMap.get(word2);Iterator<Integer> iterator_1 = indexList_1.iterator();Iterator<Integer> iterator_2 = indexList_2.iterator();int delta;int x = iterator_1.next();int y = iterator_2.next();int min = Math.abs(x - y);while ((iterator_1.hasNext()) && (iterator_2.hasNext())) {delta = x - y;min = Math.min(Math.abs(delta), min);if (delta < 0) {x = iterator_1.next();} else {y = iterator_2.next();}}min = Math.min(Math.abs(x - y), min);while (iterator_1.hasNext()) {min = Math.min(Math.abs(iterator_1.next() - y), min);}while (iterator_2.hasNext()) {min = Math.min(Math.abs(iterator_2.next() - x), min);}return min;}}
