給定二進位制字串中唯一索引 10 或 01 子字串的最大數量


在這個問題中,我們將計算使用給定二進位制字串可以形成的 10 和 01 對的最大數量。

為了解決這個問題,我們可以檢查使用相鄰字元可以形成多少個 10 和 01 對,並且兩個對不能共享任何字元。

問題陳述

我們給定一個二進位制字串 bin_str。我們需要計算僅使用相鄰字元可以形成的 10 和 01 對的最大數量。此外,我們可以將一個字元用於任何單個對。兩個對不能共享同一個字元。

示例

Input –  bin_str = "1100101"
Output – 3

解釋

我們可以在第 1 個(基於 0 的索引)索引處形成一個“10”對,並在第 3 個和第 5 個索引處形成 01 對。

Input –  bin_str = "111111";
Output – 0

解釋

該字串包含全部“1”。因此,我們無法形成任何 10 或 01 對。

Input –  bin_str = "101";
Output – 1

解釋

我們不能在兩個對中共享同一個字元。因此,我們只能形成 10 或 01 對。

方法 1

在這種方法中,我們將使用布林變數來跟蹤前一個字元是否與前一個對一起使用。因此,我們可以形成唯一的 10 和 01 對,而不會共享相鄰的字元。

此外,我們將計算不同相鄰字元的數量以獲得 01 和 10 對的數量。

演算法

  • 步驟 1 - 初始化“cnt”為 0 以儲存對的數量,並將“isPrev”初始化為 true 以跟蹤前一個字元是否可用以形成對。

  • 步驟 2 - 從第 1 個索引開始遍歷二進位制字串。

  • 步驟 3 - 如果索引 p 和 p – 1 處的字元不同且“isPrev”為 true,則將“cnt”值加 1,因為我們找到了 01 或 10 的對。此外,將“isPrev”更新為 false,因為當前字元不可用於與下一個字元形成對。

  • 步驟 4 - 否則,將“isPrev”更新為 true。

  • 步驟 5 - 最後,返回“cnt”值。

示例

#include <bits/stdc++.h>
using namespace std;

int countPairs(string bin_str) {

   // To store the count of pairs
   int cnt = 0;

   // To track whether we can use the previous character in the pair
   bool isPrev = true;

   // Iterate the string
   for (int p = 1; p < bin_str.size(); p++) {

      // Check whether adjacent characters are different and previous characters available to make a pair
      if (bin_str[p] != bin_str[p - 1] && isPrev) {

         // Current character gets used
         isPrev = false;
         cnt++;
      } else {

         // Make the current character free for the next pair
         isPrev = true;
      }
   }
   return cnt;
}
int main() {
   string bin_str = "1100101";
   cout << "The maximum number of 01 and 10 cnt is " << countPairs(bin_str);
   return 0;
}

輸出

The maximum number of 01 and 10 cnt is 3
  • 時間複雜度 - 遍歷字串需要 O(N)。

  • 空間複雜度 - O(1)

我們已經計算了可以使用二進位制字串的相鄰字元形成的 10 和 01 對的數量。程式設計師可能會計算在給定二進位制字串中可以形成的 100 和 001 對的最大數量。在這種情況下,我們需要使用整型變數來檢查前兩個字元是否可用,而不是使用單個布林值。

更新於: 2023年10月5日

95 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告