且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[CareerCup] 18.5 Shortest Distance between Two Words 两单词间的最短距离

更新时间:2022-09-16 19:25:02

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? 

LeetCode上的原题,请参见我之前的博客Shortest Word DistanceShortest Word Distance II和 Shortest Word Distance III

解法一:

// Call One Time
int 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;
}

本文转自博客园Grandyang的博客,原文链接:两单词间的最短距离[CareerCup] 18.5 Shortest Distance between Two Words ,如需转载请自行联系原博主。