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

C++で単語を綴るステッカー


N種類のステッカーがあるとします。各タイプのステッカーには、小文字の英語の単語が付いています。ステッカーのコレクションから個々の文字を切り取り、それらを再配置することによって、指定されたターゲット文字列を綴りたいと思います。必要に応じて各ステッカーを複数回使用でき、各ステッカーの数量は無限です。

ターゲットを綴るのに必要なステッカーの最小数を見つける必要がありますか?タスクが不可能な場合は、-1を返します。

したがって、入力が["dog"、 "sentence"、 "antenna"]のようで、ターゲットが "dance"の場合、答えは3になります

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

  • n:=ターゲットのサイズ
  • N:=1を左にn回シフト
  • サイズNの配列dpを定義し、infで初期化します
  • dp [0]:=0
  • iを初期化する場合:=0、i
  • dp [i]がinfと同じ場合、-
    • 次の部分を無視し、次の反復にスキップします
  • jを初期化する場合:=0、j <ステッカーのサイズの場合、更新(jを1増やします)、実行-
    • s:=ステッカー[j]
    • x:=i
    • kを初期化する場合:=0、k
    • z:=s [k]
    • 初期化l:=0の場合、l <ターゲットのサイズの場合、更新(lを1増やします)、実行-
      • target [l]がzと同じで、(右シフトx、lビット)AND 1)が0と同じ場合、-
        • x:=x OR(1を左にlビットシフト)
        • ループから抜け出す
  • dp [x]:=最小のdp[x]およびdp[i] + 1
  • return dp [N --1]はinfで、その後-1で設定されます。それ以外の場合はdp [N-1]で設定されます
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int minStickers(vector<string>& stickers, string target) {
          int n = target.size();
          int N = 1 << n;
          vector <int> dp(N, INT_MAX);
          dp[0] = 0;
          for(int i = 0; i < N; i++){
             if(dp[i] == INT_MAX) continue;
             for(int j = 0; j < stickers.size(); j++){
                string s = stickers[j];
                int x = i;
                for(int k = 0; k < s.size(); k++){
                   char z = s[k];
                   for(int l = 0; l < target.size(); l++){
                      if(target[l] == z && ((x >> l) & 1) == 0){
                         x |= (1 << l);
                         break;
                      }
                   }
                }
                dp[x] = min(dp[x], dp[i] + 1);
             }
          }
          return dp[N - 1] == INT_MAX? -1 : dp[N - 1];
       }
    };
    main(){
       Solution ob;
       vector<string> v = {"dog", "sentence","antenna"};
       cout << (ob.minStickers(v, "dance"));
    }

    入力

    ["dog", "sentence","antenna"]
    "dance"

    出力

    3

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

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

    2. 修正:Wordでスペルチェックが機能しない

      Microsoft Wordは、Microsoftによって開発されたワードプロセッサです。それは何十年も前から存在しており、世界中で最も使用されているオフィスアプリケーションです。さまざまな問題を対象とし、さまざまな機能を改善するために、Microsoft自体から定期的に更新を受け取ります。 Microsoft Wordを使用しているユーザーは、自分の単語がエディターによって監視されていないという問題に遭遇する可能性があります。この問題は通常大きな問題ではなく、いくつかの設定を変更することで簡単に修正できます。さまざまな設定を確認していきます。最初のものから始めて、下に向かって進んでください