You have a large text file containing words. Given any two words, find the shortest distance (in terms of number of words) between them in the file. If the operation will be repeated many times for the same file (but different pairs of words), can you optimize your solution?
Input: words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student" Output: 1 Note:
Copy class Solution {
public:
int findClosest(vector<string>& words, string word1, string word2) {
int index1 = -0x3f3f3f3f, index2 = -0x3f3f3f3f;
int res = INT_MAX;
for (int i = 0; i < words.size(); i++) {
if (words[i] == word1) {
index1 = i;
res = min(res, index1 - index2);
}
else if (words[i] == word2) {
index2 = i;
res = min(res, index2 - index1);
}
}
return res;
}
};
Copy class Solution {
public:
int findClosest(vector<string>& words, string word1, string word2) {
// preprocess
unordered_map<string, vector<int>> m;
for (int i = 0; i < words.size(); i++)
m[words[i]].push_back(i);
auto & v1 = m[word1];
auto & v2 = m[word2];
if (v1.empty() || v2.empty())
return -1;
// two pointers, similar to merge two sorted lists
int prev_is1 = true, prev = -0x3f3f3f3f;
int i1 = 0, i2 = 0, res = INT_MAX;
while (i1 < v1.size() || i2 < v2.size()) {
int cur, cur_is1;
if (i1 < v1.size() && (i2 == v2.size() || v1[i1] < v2[i2])) {
cur = v1[i1++];
cur_is1 = true;
}
else {
cur = v2[i2++];
cur_is1 = false;
}
if (prev_is1 != cur_is1)
res = min(res, cur - prev);
prev = cur;
prev_is1 = cur_is1;
}
return res;
}
};