解法一

题中说明需要多次查询,但实际题目中并没有体现出来。用双指针一遍遍历在本题中是快速的方法,但是我认为这不符合原意。
用Map存储单词出现的下标序列,然后双指针找最小差值。其实两个下标序列都是有序的,找最小差值的时候可以使用二分查找进一步优化。

  1. import java.util.*;
  2. class Solution {
  3. public int findClosest(String[] words, String word1, String word2) {
  4. // 存储每个单词的位置序列
  5. Map<String, List<Integer>> wordIndexMap = new HashMap<>();
  6. int i = 0;
  7. for (i = 0; i < words.length; ++i) {
  8. if (wordIndexMap.containsKey(words[i])) {
  9. wordIndexMap.get(words[i]).add(i);
  10. } else {
  11. LinkedList<Integer> list = new LinkedList<>();
  12. list.add(i);
  13. wordIndexMap.put(words[i], list);
  14. }
  15. }
  16. List<Integer> indexList_1 = wordIndexMap.get(word1);
  17. List<Integer> indexList_2 = wordIndexMap.get(word2);
  18. Iterator<Integer> iterator_1 = indexList_1.iterator();
  19. Iterator<Integer> iterator_2 = indexList_2.iterator();
  20. int delta;
  21. int x = iterator_1.next();
  22. int y = iterator_2.next();
  23. int min = Math.abs(x - y);
  24. while ((iterator_1.hasNext()) && (iterator_2.hasNext())) {
  25. delta = x - y;
  26. min = Math.min(Math.abs(delta), min);
  27. if (delta < 0) {
  28. x = iterator_1.next();
  29. } else {
  30. y = iterator_2.next();
  31. }
  32. }
  33. min = Math.min(Math.abs(x - y), min);
  34. while (iterator_1.hasNext()) {
  35. min = Math.min(Math.abs(iterator_1.next() - y), min);
  36. }
  37. while (iterator_2.hasNext()) {
  38. min = Math.min(Math.abs(iterator_2.next() - x), min);
  39. }
  40. return min;
  41. }
  42. }