C ++中最短的字距II

假设有一个类在构造函数中接收单词列表,那么将有一个方法接收两个单词word1和word2并在列表中找到这两个单词之间的最短距离。该方法将使用不同的参数多次重复调用。

让我们假设单词= [“练习”,“成功”,“完美”,“技能”,“成功”]。

因此,如果输入像word1 =“ skill”,word2 =“ practice”,则输出为3

为了解决这个问题,我们将遵循以下步骤-

  • 定义一张映射

  • 初始化程序需要一个单词数组

    • 在m [words [i]]的末尾插入i

    • 对于初始化i:= 0,当i <字长时,更新(将i增加1),执行-

    • 定义一个函数shortest(),它将使用word1,word2,

    • 定义一个数组arr1:= m [word1]

    • 定义一个数组arr2:= m [word2]

    • i:= 0,j:= 0

    • ret:=无穷大

    • 而(i <arr1的大小而j <arr2的大小),做-

      • (将j增加1)

      • (将i增加1)

      • ret:= ret和| arr1 [i]-arr2 [j] |的最小值

      • 如果arr1 [i] <arr2 [j],则-

      • 除此以外

      • 返回ret

      例 

      让我们看下面的实现以更好地理解-

      #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"));
      }

      输入值

      {"practice", "makes", "perfect", "skill", "makes"}
      Call shortest("skill", "practice")
      Call shortest("makes", "skill")

      输出结果

      3
      1