C++で2つの文字列を同一にするための最小コスト
2つの文字列AとBがあり、CostAとCostBのような別の2つのコスト値があるとします。 AとBを同一にするための最小コストを見つける必要があります。文字列から文字を削除できます。文字列Aから削除するためのコストはCostAであり、文字列Bから削除するためのコストはCostBです。文字列からすべての文字を削除するコストは同じです。文字列A=“ wxyz”、B =“ wyzx”、CostAが10、CostBが20であると仮定します。したがって、出力は30になります。両方の文字列からxを削除すると、AとBは同じになります。したがって、コストは10 + 20=30です。
これは最長共通部分列問題のバリエーションの1つです。 AとBからLCSの長さを見つけ、次にAとBからLCSの長さを引く必要があります。これにより、削除する文字数を取得できます。
例
#include <iostream> using namespace std; bool isRepresentedInDDigits(int num, int d, int base) { if (d==1 && num < base) return true; if (d > 1 && num >= base) return isRepresentedInDDigits(num/base, --d, base); return false; } bool checkNumber(int num, int d) { // Check for all bases one by one for (int base=2; base<=32; base++) if (isRepresentedInDDigits(num, d, base)) return true; return false; } int main() { int num = 8; int dig = 2; if(checkNumber(num, dig)) cout << "Can be represented"; else cout << "Can not be represented"; }
出力
Can be represented
-
C++で文字を削除せずに2つの文字列アナグラムを作成するために必要な操作の最小数
同じ長さの2つの文字列があるとすると、文字を削除せずに、2つの文字列のアナグラムを作成するために必要な最小限の変更を見つける必要があります。アナグラムは、同じ文字セットを持つ2つの文字列です。 2つの文字列が「HELLO」であり、ここで「WORLD」が必要な変更の数が3であると仮定します。この場合、3つの文字が異なります。 考え方は単純です。最初の文字列の各文字の頻度を見つけてから、2番目の文字列を調べ、2番目の文字列の文字が周波数配列に存在する場合は、頻度の値を減らします。頻度の値が0未満の場合は、最終カウントを1増やします。 例 #include <iostream> usi
-
C++で互いに素な配列を作成するための最小限の挿入
このセクションでは、別の興味深い問題が発生します。 N個の要素の配列があるとします。この配列を互いに素な配列にするためには、交点の最小数を見つける必要があります。互いに素な配列では、2つの連続する要素ごとのgcdは1です。配列も印刷する必要があります。 {5、10、20}のような要素があるとします。これは互いに素な配列ではありません。ここで、5、10、10、20の間に1を挿入すると、互いに素な配列になります。したがって、配列は{5、1、10、1、20}のようになります。 アルゴリズム makeCoPrime(arr, n): begin count := 0 &nb