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

C++で最長の共通プレフィックスの最小シフトを見つける


2つのストリングAとBがあるとします。AとBの長さは同じです。 1回のシフトで、文字列Bを1要素回転させることができます。 AとBから最大長の共通プレフィックスを取得するには、必要な最小シフトを見つける必要があります。したがって、A =「コンピュータープログラミング」、B =「プログラミング言語」の場合、最小シフトは8で、プレフィックスは「プログラミング」です。

>

Bの最後に文字列Bを追加すると、B =B + Bとなるため、各シフトのプレフィックスを個別に検索する必要はありません。したがって、Bに存在するAの最長のプレフィックスを見つける必要があり、Bのプレフィックスの開始位置は、必要なシフトの実際の数を示します。

#include<iostream>
using namespace std;
void KhuthMorrisPatt(int m, int n, string B, string A) {
   int pos = 0, len = 0;
   int p[m + 1];
   int k = 0;
   p[1] = 0;
   for (int i = 2; i <= n; i++) {
      while (k > 0 && A[k] != A[i - 1])
         k = p[k];
      if (A[k] == A[i - 1])
         ++k;
         p[i] = k;
      }
      for (int j = 0, i = 0; i < m; i++) {
         while (j > 0 && A[j] != B[i])
            j = p[j];
         if (A[j] == B[i])
            j++;
         if (j > len) {
            len = j;
            pos = i - j + 1;
         }
   }
   cout << "Shift = " << pos << endl;
   cout << "Prefix = " << A.substr(0, len);
}
int main() {
   string A = "programminglanguage";
   string B = "computerprogramming";
   int n = A.size();
   B = B + B;
   KhuthMorrisPatt(2 * n, n, B, A);
}

出力

Shift = 8
Prefix = programming

  1. C++で要素を削除するための所定のルールを使用して配列の可能な最小サイズを見つけます

    この問題では、n個の数値と整数値kの配列が与えられます。私たちのタスクは、要素を削除するための所定のルールを使用して、配列の可能な最小サイズを見つけることです。 問題の説明 −配列内の要素の数を最小限に抑える必要があります。次の削除操作を使用すると、一度に削除できる要素の数は3になります。3つの要素が2つの指定された条件を満たす場合、削除が可能です。 条件1 条件2 − 2つの近くの要素の差はkです。つまり、arr [i + 1] =arr [i]+kおよびarr[i+ 2] =arr [i + 1]+kです。 問題を理解するために例を見てみましょう 入力 {4, 6, 8, 4,

  2. C++で二分木の最小の深さを見つける

    この問題では、二分木が与えられます。私たちの仕事は、二分木のMinimumDepthを見つけることです。 二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。 二分木の最小の深さは、ルートノードから任意のリーフノードまでの最短経路です。 問題を理解するために例を見てみましょう 入力 出力 2 ソリューションアプローチ この問題の解決策は、二分木をトラバースして高さを数えることです。これは、リーフ以外のノードごとにノードの子ノードを再帰的に呼び出し、リーフノードごとに1を返すことで実行できます。 ソリューションの動作を説明するプログラム 例 #in