给定二进制字符串中唯一索引 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 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告