This is a follow up of . The only difference is now you are given the list of words and your method will be called repeatedly many times with different parameters. How would you optimize it?
Design a class which receives a list of words in the constructor, and implements a method that takes two words word1 and word2 and return the shortest distance between these two words in the list.
For example,
Assume that words =["practice", "makes", "perfect", "coding", "makes"]
. Given word1 = “coding”
, word2 = “practice”
, return 3.
"makes"
, word2 = "coding"
, return 1. Note:
You may assume that word1 does not equal to word2, and word1 and word2 are both in the list.这道题是之前那道的拓展,不同的是这次我们需要多次调用求最短单词距离的函数,那么用之前那道题的解法二和三就非常不高效,而当时我们摒弃的解法一的思路却可以用到这里,我们用哈希表来建立每个单词和其所有出现的位置的映射,然后在找最短单词距离时,我们只需要取出该单词在哈希表中映射的位置数组进行两两比较即可,参见代码如下:
解法一:
class WordDistance {public: WordDistance(vector& words) { for (int i = 0; i < words.size(); ++i) { m[words[i]].push_back(i); } } int shortest(string word1, string word2) { int res = INT_MAX; for (int i = 0; i < m[word1].size(); ++i) { for (int j = 0; j < m[word2].size(); ++j) { res = min(res, abs(m[word1][i] - m[word2][j])); } } return res; } private: unordered_map