C++でバイナリ文字列を交互にするために必要な最小スワップ
問題の説明
偶数の長さと同じ数の0と1のバイナリ文字列が与えられます。文字列を交互にするためのスワップの最小数はいくつですか? 2つの連続する要素が等しくない場合、バイナリ文字列は交互になります
例
str =11110000の場合、2つのスワップが必要です。
アルゴリズム
- 文字列の奇数位置と偶数位置のゼロの数を数えます。それらのカウントをそれぞれoddZeroCntとevenZeroCntとします
- 文字列の奇数位置と偶数位置にあるものの数を数えます。それらのカウントをそれぞれoddOneCntとevenOneCntとします
- 常に1を0でスワップします。したがって、交互の文字列が0で始まるかどうかを確認するだけで、スワップの数は最小(evenZeroCnt、oddOneCnt)であり、交互の文字列が1で始まる場合、スワップの数は次のようになります。 min(evenOneCnt、oddZeroCnt)。答えはこれら2つの最小値です
例
#include <bits/stdc++.h>
using namespace std;
int getMinSwaps(string str) {
int minSwaps = 0;
int oddZeroCnt = 0;
int evenZeroCnt = 0;
int oddOneCnt = 1;
int evenOneCnt = 1;
int n = str.length();
for (int i = 0; i < n; ++i) {
if (i % 2 == 0) {
if (str[i] == '1') {
++evenOneCnt;
} else {
++evenZeroCnt;
}
} else {
if (str[i] == '1') {
++oddOneCnt;
} else {
++oddZeroCnt;
}
}
}
int zeroSwapCnt = min(evenZeroCnt, oddOneCnt);
int oneSwapCnt = min(evenOneCnt, oddZeroCnt);
return min(zeroSwapCnt, oneSwapCnt);
}
int main() {
string str = "11110000";
cout << "Minimum swaps = " << getMinSwaps(str) << endl;
return 0;
} 上記のプログラムをコンパイルして実行する場合。次の出力を生成します-
出力
Minimum swaps = 2
-
C++で文字列回文を作成するための削除の最小数。
問題の説明 サイズ「n」の文字列が与えられます。タスクは、文字列回文を作成するために最小数の文字を削除することです。 指定された文字列が「abcda」の場合、最初と最後を除く任意の2文字を削除して、回文にすることができます。 文字「b」と「c」を削除すると、「ada」文字列は回文になります 文字「c」と「d」を削除すると、「aba」文字列は回文になります 文字「b」と「d」を削除すると、「aca」文字列は回文になります アルゴリズム 1. Find longest palindromic subsequence of given string. Let’s
-
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