Home  >  Article  >  Backend Development  >  Minimum number of non-adjacent pair flips required to remove all zeros in a binary string

Minimum number of non-adjacent pair flips required to remove all zeros in a binary string

WBOY
WBOYforward
2023-09-04 13:09:06709browse

Minimum number of non-adjacent pair flips required to remove all zeros in a binary string

In a binary string, flipping a pair of adjacent bits can easily remove a single 0 from the string. However, when we need to remove all 0's from a binary string, we may also need to flip non-adjacent bit pairs. In this article, we will discuss how to determine the minimum number of non-adjacent pair flips required to remove all 0's from a binary string.

algorithm

To solve this problem, we will use a simple greedy algorithm. The idea is to always choose the pair of bits that are furthest away from each other and have at least one 0 in between. We can then flip these two bits, effectively removing a 0 from the string. We repeat this process until all 0's have been removed.

Now let us implement this algorithm in C.

Example

#include <iostream>
#include <cstring>

using namespace std;

int main() {
   string s;
   s="100101000";
   int n = s.size();
   
   int cnt = 0;
   for (int i = 0; i < n; i++) {
      if (s[i] == '0') {
         cnt++;
         if (i+2 < n && s[i+2] == '0') {
            i += 2;
         }
         else {
            i++;
         }
      }
   }
   
   cout << cnt << endl;
   return 0;
}

Output

3

Code description

The code above takes a binary string as input and calculates the minimum number of non-adjacent pair flips required to remove all 0's from the string. Now let's look at the code in detail.

First, we take a binary string as input and store it in the string variable "s". We also store the size of the string in an integer variable "n".

string s;
cin >> s;
int n = s.size();

Next, we initialize the variable "cnt" to store the number of 0's in the string. We then iterate over the string using a for loop. For each 0 encountered, we increment the count of 0s and check if the next two bits are also 0s. If so, we flip the pair of bits by increasing the index by 2. Otherwise, we flip only adjacent bit pairs by increasing the index by 1.

int cnt = 0;
for (int i = 0; i < n; i++) {
   if (s[i] == '0') {
      cnt++;
      if (i+2 < n && s[i+2] == '0') {
         i += 2;
      }
      else {
         i++;
      }
   }
}

Finally, we output the count of non-adjacent pair flips required to remove all 0's from the string.

cout << cnt << endl;

Test case example

Let us consider the binary string "100101000". The minimum number of non-adjacent pair flips required to remove all 0's from this string can be calculated using the algorithm above.

First, we encounter 0 at position 2. We flip the (1,3) pair to get the string "110101000". Then we encounter the next 0 at position 5. We flip the (1,7) pair to get the string "111101000". Then we encounter the next 0 at position 8. We flip the (1,9) pair to get the string "111111000". Now all 0's have been removed from the string.

The number of non-adjacent pair flips required to remove all 0's from a string is 3. We can verify this by running the above C code on the input string "100101000".

in conclusion

In this article, we discussed how to determine the minimum number of non-adjacent pair flips required to remove all 0's from a binary string. We use a simple greedy algorithm to solve this problem and implement it in C code. We also provide an example test case to illustrate how the algorithm works.

The above is the detailed content of Minimum number of non-adjacent pair flips required to remove all zeros in a binary string. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:tutorialspoint.com. If there is any infringement, please contact admin@php.cn delete