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