C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での最短単語距離II


コンストラクターに単語のリストを受け取るクラスがあるとすると、word1とword2の2つの単語を受け取り、リスト内のこれら2つの単語間の最短距離を見つけるメソッドがあります。そのメソッドは、さまざまなパラメータを使用して何度も繰り返し呼び出されます。

言葉=["練習"、 "作る"、 "完璧"、 "スキル"、"作る"]と仮定しましょう。

したがって、入力がword1 =「スキル」、word2 =「練習」のような場合、出力は3になります

これを解決するには、次の手順に従います-

  • 1つのマップを定義するm

  • イニシャライザは単語の配列を取ります

    • 初期化i:=0の場合、i <単語のサイズの場合、更新(iを1増やします)、実行-

      • m [words [i]]

        の最後にiを挿入します
  • 関数shortest()を定義します。これには、word1、word2、

    が必要です。
  • 配列を定義するarr1:=m [word1]

  • 配列を定義するarr2:=m [word2]

  • i:=0、j:=0

  • ret:=無限大

  • 一方(i

    • ret:=retの最小値と|arr1 [i] --arr2 [j] |

    • arr1 [i]

      • (iを1増やします)

    • それ以外の場合

      • (jを1増やします)

  • 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

  1. C++での最短のマジョリティ部分文字列

    小文字のアルファベット文字列sがあるとすると、ある文字が他の文字を組み合わせたものよりも多く表示されるように、最短の部分文字列の長さ(最小の長さは2)を見つける必要があります。解決策が見つからない場合は、-1を返します。 したがって、入力が「abbbcde」のような場合、出力は2になります。サブストリング「bb」の長さは最小で、これは他の文字よりも多く表示されます。 これを解決するには、次の手順に従います- 関数ok()を定義します。これには、配列cntが必要です。 合計:=0、maxVal:=0 cnt内の要素ごとに、実行します 合計:=合計+それ maxV

  2. C++でのBKツリーの紹介

    BKツリーまたはBurkhardツリーは、レーベンシュタイン距離に基づいてスペルチェックを実行するために通常使用されるデータ構造の形式です。また、文字列照合にも使用されます。オートコレクト機能を使用して、このデータ構造を作成できます。辞書にいくつかの単語があり、他のいくつかの単語のスペルミスをチェックする必要があるとします。スペルがチェックされる特定の単語に近い単語のコレクションが必要です。たとえば、「uck」という単語がある場合、正しい単語は(truck、duck、duck、suck)になります。したがって、単語を削除するか、文字を適切な文字に置き換える新しい単語を追加することで、スペルミス