
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Shortest Word Distance II in C++
Suppose there is a class that receives a list of words in the constructor, there will be a method that takes two words word1 and word2 and find the shortest distance between these two words in the list. That method will be called repeatedly many times with different parameters.
Let us assume that words = ["practice", "makes", "perfect", "skill", "makes"].
So, if the input is like word1 = “skill”, word2 = “practice”, then the output will be 3
To solve this, we will follow these steps −
Define one map m
-
The initializer takes an array of words
-
for initialize i := 0, when i < size of words, update (increase i by 1), do −
insert i at the end of m[words[i]]
-
Define a function shortest(), this will take word1, word2,
Define an array arr1 := m[word1]
Define an array arr2 := m[word2]
i := 0, j := 0
ret := infinity
-
while (i < size of arr1 and j < size of arr2), do −
ret := minimum of ret and |arr1[i] - arr2[j]|
-
if arr1[i] < arr2[j], then −
(increase i by 1)
-
Otherwise
(increase j by 1)
return ret
Example
Let us see the following implementation to get better understanding −
#include <bits/stdc++.h> using namespace std; class WordDistance { public: unordered_map <string, vector <int< > m; WordDistance(vector<string<& words) { for(int i = 0; i < words.size(); i++){ m[words[i]].push_back(i); } } int shortest(string word1, string word2) { vector<int<& arr1 = m[word1]; vector<int<& arr2 = m[word2]; int i = 0; int j = 0; int ret = INT_MAX; while (i < arr1.size() && j < arr2.size()) { ret = min(ret, abs(arr1[i] - arr2[j])); if (arr1[i] < arr2[j]) { i++; } else j++; } return ret; } }; main(){ vector<string< v = {"practice", "makes", "perfect", "skill","makes"}; WordDistance ob(v); cout << (ob.shortest("skill", "practice")) << endl; cout << (ob.shortest("makes", "skill")); }
Input
{"practice", "makes", "perfect", "skill", "makes"} Call shortest("skill", "practice") Call shortest("makes", "skill")
Output
3 1