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

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

  1. C++で文字列回文を作成するための削除の最小数。

    問題の説明 サイズ「n」の文字列が与えられます。タスクは、文字列回文を作成するために最小数の文字を削除することです。 指定された文字列が「abcda」の場合、最初と最後を除く任意の2文字を削除して、回文にすることができます。 文字「b」と「c」を削除すると、「ada」文字列は回文になります 文字「c」と「d」を削除すると、「aba」文字列は回文になります 文字「b」と「d」を削除すると、「aca」文字列は回文になります アルゴリズム 1. Find longest palindromic subsequence of given string. Let’s

  2. 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