[CareerCup] 18.5 Shortest Distance between Two Words 兩單詞間的最短距離
阿新 • • 發佈:2018-12-29
18.5 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?
解法一:
// Call One Timeint shortest_dist(vector<string> words, string word1, string word2) { int p1 = -1, p2 = -1, res = INT_MAX; for (int i = 0; i < words.size(); ++i) { if (words[i] == word1) p1 = i; if (words[i] == word2) p2 = i; if (p1 != -1 && p2 != -1) res = min(res, abs(p1 - p2)); }return res; }
解法二:
// Call Many Times int shortest_dist(vector<string> words, string word1, string word2) { unordered_map<string, vector<int>> m; int i = 0, j = 0, res = INT_MAX; for (int i = 0; i < words.size(); ++i) { m[words[i]].push_back(i); }while (i < m[word1].size() && j < m[word2].size()) { res = min(res, abs(m[word1][i] - m[word2][j])); m[word1][i] < m[word2][j] ? ++i : ++j; } return res; }
解法三:
// word1, word2 may be same int shortest_dist(vector<string> words, string word1, string word2) { int p1 = words.size(), p2 = -words.size(), res = INT_MAX; for (int i = 0; i < words.size(); ++i) { if (words[i] == word1) p1 = word1 == word2 ? p2 : i; if (words[i] == word2) p2 = i; res = min(res, abs(p1 - p2)); } return res; }