11package com .leetcode .maps ;
22
3+ import java .util .ArrayList ;
4+ import java .util .HashMap ;
5+ import java .util .List ;
6+ import java .util .Map ;
7+
8+ import static org .junit .jupiter .api .Assertions .assertEquals ;
9+
310/**
411 * Level: Medium
512 * Problem Link: https://leetcode.com/problems/shortest-word-distance-ii/ (premium)
613 * Problem Description:
7- * This is a follow up of Shortest Word Distance. The only difference is now you are given the list of words and
8- * your method will be called repeatedly many times with different parameters. How would you optimize it?
9- * <p>
1014 * Design a class which receives a list of words in the constructor, and implements a method that takes two words
11- * word1 and word2 and return the shortest distance between these two words in the list.
15+ * word1 and word2 and return the shortest distance between these two words in the list. Your method will be called
16+ * repeatedly many times with different parameters. For a simpler variant, see {@link com.leetcode.arrays.ShortestWordDistance}.
1217 * <p>
13- * Example 1 :
18+ * Examples :
1419 * Assume that words = ["practice", "makes", "perfect", "coding", "makes"].
15- * Given word1 = "coding”, word2 = "practice”, return 3.
16- * Given word1 = "makes", word2 = "coding", return 1.
1720 * <p>
18- * Note: You may assume that word1 does not equal to word2, and word1 and word2 are both in the list.
21+ * Input1: word1 = “coding”, word2 = “practice”
22+ * Output1: 3
23+ * <p>
24+ * Input2: word1 = "makes", word2 = "coding"
25+ * Output2: 1
1926 * <p>
20- * Lastly, for a simpler variant, see {@link com.leetcode.arrays.ShortestWordDistance} .
27+ * Note: You may assume that word1 does not equal to word2, and word1 and word2 are both in the list .
2128 *
2229 * @author rampatra
2330 * @since 2019-07-31
2431 */
2532public class ShortestWordDistanceII {
2633
27- public static int findShortestDistance (String [] words , String word1 , String word2 ) {
28- return -1 ;
34+ private String [] words ;
35+ private Map <String , List <Integer >> wordsToIndexesMap ;
36+
37+ ShortestWordDistanceII (String [] words ) {
38+ this .words = words ;
39+ this .wordsToIndexesMap = getWordsToIndexesMap ();
2940 }
3041
31- public static void main (String [] args ) {
42+ public int findShortestDistance (String word1 , String word2 ) {
43+ return findShortestDistance (wordsToIndexesMap .get (word1 ), wordsToIndexesMap .get (word2 ));
44+ }
3245
46+ private int findShortestDistance (List <Integer > indexes1 , List <Integer > indexes2 ) {
47+ int minDistance = Integer .MAX_VALUE ;
48+
49+ for (int i = 0 , j = 0 ; i < indexes1 .size () && j < indexes2 .size (); ) {
50+ if (indexes1 .get (i ) <= indexes2 .get (j )) {
51+ minDistance = Math .min (minDistance , Math .abs (indexes1 .get (i ) - indexes2 .get (j )));
52+ i ++;
53+ } else if (indexes1 .get (i ) > indexes2 .get (j )) {
54+ minDistance = Math .min (minDistance , Math .abs (indexes1 .get (i ) - indexes2 .get (j )));
55+ j ++;
56+ }
57+ }
58+
59+ return minDistance ;
60+ }
61+
62+ private Map <String , List <Integer >> getWordsToIndexesMap () {
63+ Map <String , List <Integer >> wordsToIndexesMap = new HashMap <>();
64+
65+ for (int i = 0 ; i < words .length ; i ++) {
66+ wordsToIndexesMap .putIfAbsent (words [i ], new ArrayList <>());
67+ wordsToIndexesMap .get (words [i ]).add (i );
68+ }
69+ return wordsToIndexesMap ;
70+ }
71+
72+ public static void main (String [] args ) {
73+ ShortestWordDistanceII shortestWordDist = new ShortestWordDistanceII (new String []{"practice" , "makes" , "perfect" , "coding" , "makes" });
74+ assertEquals (1 , shortestWordDist .findShortestDistance ("coding" , "makes" ));
75+ assertEquals (1 , shortestWordDist .findShortestDistance ("perfect" , "makes" ));
76+ assertEquals (1 , shortestWordDist .findShortestDistance ("practice" , "makes" ));
77+ assertEquals (1 , shortestWordDist .findShortestDistance ("makes" , "practice" ));
78+ assertEquals (3 , shortestWordDist .findShortestDistance ("coding" , "practice" ));
79+ assertEquals (0 , shortestWordDist .findShortestDistance ("coding" , "coding" ));
80+ assertEquals (0 , shortestWordDist .findShortestDistance ("makes" , "makes" ));
3381 }
34- }
82+ }
0 commit comments