C++でバイナリ文字列から「01」「10」のペアを削除!必要な最小削除回数を求める方法
このチュートリアルでは、バイナリ文字列(0と1のみで構成される文字列)から「01」および「10」のペアをすべて取り除くために必要な削除回数の合計を求めるC++プログラムを紹介します。まずは具体例を見てみましょう。
入力 − 101010001
出力 − 4
上記の例では、「01」と「10」のペアをすべて文字列から除去するために、合計4回の削除が必要になります。
すべてのペアを削除した後に残る文字列は 0 です。
解法の考え方
バイナリ文字列から「01」と「10」のペアをすべて削除するということは、隣り合う異なる文字(0と1)を順番に取り除いていくことを意味します。この操作を繰り返すと、最終的に残るのはどちらか一方の文字だけです。
したがって、削除が必要なペアの総数は、0の個数と1の個数のうち小さい方、すなわち min(count(0), count(1)) となります。
問題を解くための手順は以下の通りです。
バイナリ文字列を初期化します。
文字列内の0と1の個数をそれぞれカウントします。
0の個数と1の個数のうち、小さい方を出力します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int findMinimumNumberOfDeletions(string str, int len) {
int zeroes_count = 0, ones_count = 0;
// 0と1の個数をカウント
for (int i = 0; i < len; i++) {
if (str[i] == '0') {
zeroes_count++;
}
else {
ones_count++;
}
}
return min(zeroes_count, ones_count);
}
int main() {
string str = "101010001";
int len = str.length();
cout << findMinimumNumberOfDeletions(str, len) << endl;
return 0;
}
実行結果
上記のプログラムを実行すると、次のような結果が得られます。
4
まとめ
このように、文字列中の0と1の出現回数を数えて小さい方を選ぶだけで、O(n) の計算量で効率的に答えを求められます。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で2つの2進数文字列を加算するプログラムの書き方
2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁
-
C++プログラムにおける二分探索(バイナリサーチ)の基本と実装
二分探索(バイナリサーチ)とは二分探索は「半区間探索」「対数探索」「バイナリチョップ」とも呼ばれる検索アルゴリズムで、ソート済みの配列の中から目的の値が存在する位置を効率的に見つけ出します。基本的な仕組みは非常にシンプルです。まず、探したい値(ターゲット値)を配列の中央の要素と比較します。一致しなかった場合は、ターゲット値が存在し得ない半分を丸ごと排除し、残りの半分に対して同様の比較を繰り返します。この「中央との比較」と「範囲の絞り込み」を続け、ターゲット値が見つかるか、検索範囲が空になる(=配列にその値が存在しない)かのどちらかで処理が終了します。アイデア自体は簡単ですが、正しく実装するには